[N.name], "
var/atom/disk_loc = N.loc
- while(!istype(disk_loc, /turf))
- if(istype(disk_loc, /mob))
+ while(!isturf(disk_loc))
+ if(ismob(disk_loc))
var/mob/M = disk_loc
dat += "carried by [M.real_name] "
- if(istype(disk_loc, /obj))
+ if(isobj(disk_loc))
var/obj/O = disk_loc
dat += "in \a [O.name] "
disk_loc = disk_loc.loc
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index cce111cdbfb..1065b1fa29c 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -389,7 +389,7 @@
feedback_add_details("admin_secrets_fun_used","BO")
message_admins("[key_name_admin(usr)] broke all lights")
for(var/obj/machinery/light/L in machines)
- L.broken()
+ L.break_light_tube()
if("anime")
if(!check_rights(R_FUN))
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index d47aaa90f2d..a5157a25298 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1339,7 +1339,7 @@
if(!ismob(M))
usr << "This can only be used on instances of type /mob."
return
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
@@ -1387,7 +1387,7 @@
if(!ismob(M))
usr << "This can only be used on instances of type /mob."
return
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
@@ -1417,7 +1417,7 @@
if(!ismob(M))
usr << "This can only be used on instances of type /mob."
return
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
@@ -1447,7 +1447,7 @@
if(!ismob(M))
usr << "This can only be used on instances of type /mob."
return
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
@@ -1470,7 +1470,7 @@
if(!ismob(M))
usr << "This can only be used on instances of type /mob."
return
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
@@ -1481,7 +1481,7 @@
I.layer = initial(I.layer)
I.dropped(M)
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/observer = M
observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(observer), slot_w_uniform)
observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), slot_shoes)
@@ -1569,7 +1569,7 @@
return
var/mob/M = locate(href_list["makeanimal"])
- if(istype(M, /mob/new_player))
+ if(isnewplayer(M))
usr << "This cannot be used on instances of type /mob/new_player."
return
@@ -1929,7 +1929,7 @@
switch(where)
if("inhand")
- if (!iscarbon(usr) && !isrobot(usr))
+ if (!iscarbon(usr) && !iscyborg(usr))
usr << "Can only spawn in hand when you're a carbon mob or cyborg."
where = "onfloor"
target = usr
@@ -1972,7 +1972,7 @@
var/mob/living/L = usr
var/obj/item/I = O
L.put_in_hands(I)
- if(isrobot(L))
+ if(iscyborg(L))
var/mob/living/silicon/robot/R = L
if(R.module)
R.module.add_module(I)
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index e36a81bf833..4dc8490eceb 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -134,7 +134,7 @@
vals += v
vals[v] = SDQL_expression(d, set_list[v])
- if(istype(d, /turf))
+ if(isturf(d))
for(var/v in vals)
if(v == "x" || v == "y" || v == "z")
continue
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 0b55145c846..718bc116192 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -23,9 +23,9 @@
var/list/client/targets[0]
for(var/client/T)
if(T.mob)
- if(istype(T.mob, /mob/new_player))
+ if(isnewplayer(T.mob))
targets["(New Player) - [T]"] = T
- else if(istype(T.mob, /mob/dead/observer))
+ else if(isobserver(T.mob))
targets["[T.mob.name](Ghost) - [T]"] = T
else
targets["[T.mob.real_name](as [T.mob.name]) - [T]"] = T
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 16bd59b1684..c68066cac0a 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -242,34 +242,34 @@
. = 1
switch(mode)
if(BASIC_BUILDMODE)
- if(istype(object,/turf) && left_click && !alt_click && !ctrl_click)
+ if(isturf(object) && left_click && !alt_click && !ctrl_click)
var/turf/T = object
- if(istype(object,/turf/open/space))
+ if(isspaceturf(object))
T.ChangeTurf(/turf/open/floor/plasteel)
- else if(istype(object,/turf/open/floor))
+ else if(isfloorturf(object))
T.ChangeTurf(/turf/closed/wall)
- else if(istype(object,/turf/closed/wall))
+ else if(iswallturf(object))
T.ChangeTurf(/turf/closed/wall/r_wall)
log_admin("Build Mode: [key_name(user)] built [T] at ([T.x],[T.y],[T.z])")
return
else if(right_click)
log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])")
- if(istype(object,/turf/closed/wall))
+ if(iswallturf(object))
var/turf/T = object
T.ChangeTurf(/turf/open/floor/plasteel)
- else if(istype(object,/turf/open/floor))
+ else if(isfloorturf(object))
var/turf/T = object
T.ChangeTurf(/turf/open/space)
else if(istype(object,/turf/closed/wall/r_wall))
var/turf/T = object
T.ChangeTurf(/turf/closed/wall)
- else if(istype(object,/obj))
+ else if(isobj(object))
qdel(object)
return
- else if(istype(object,/turf) && alt_click && left_click)
+ else if(isturf(object) && alt_click && left_click)
log_admin("Build Mode: [key_name(user)] built an airlock at ([object.x],[object.y],[object.z])")
new/obj/machinery/door/airlock(get_turf(object))
- else if(istype(object,/turf) && ctrl_click && left_click)
+ else if(isturf(object) && ctrl_click && left_click)
switch(build_dir)
if(NORTH)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index e152c347d06..f562ec3bdb7 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -24,7 +24,7 @@
var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\""
for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
+ if(isnewplayer(M))
continue
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
M.show_message(rendered, 2)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index b7dc53adae1..4ed208924f8 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -220,7 +220,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
var/turf/T = mob.loc
- if (!( istype(T, /turf) ))
+ if(!isturf(T))
return
var/datum/gas_mixture/env = T.return_air()
@@ -241,7 +241,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!ticker || !ticker.mode)
alert("Wait until the game starts")
return
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
log_admin("[key_name(src)] has robotized [M.key].")
var/mob/living/carbon/human/H = M
spawn(0)
@@ -257,7 +257,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!ticker || !ticker.mode)
alert("Wait until the game starts")
return
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
log_admin("[key_name(src)] has blobized [M.key].")
var/mob/living/carbon/human/H = M
spawn(0)
@@ -280,7 +280,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
alert("That mob doesn't seem to exist, close the panel and try again.")
return
- if(istype(M, /mob/new_player))
+ if(isnewplayer(M))
alert("The mob must not be a new_player.")
return
@@ -301,7 +301,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available
if(!choice)
return 0
- if(!istype(choice, /mob/dead/observer))
+ if(!isobserver(choice))
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
if(confirm != "Yes")
return 0
@@ -427,7 +427,7 @@ var/global/list/g_fancy_list_of_types = null
if(!ticker || !ticker.mode)
alert("Wait until the game starts")
return
- if (istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/worn = H.wear_id
var/obj/item/weapon/card/id/id = null
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index a69cc1df9dc..7d75d17956a 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -8,7 +8,7 @@
var/datum/gas_mixture/GM = target.return_air()
var/list/GM_gases
var/burning = 0
- if(istype(target, /turf/open))
+ if(isopenturf(target))
var/turf/open/T = target
if(T.active_hotspot)
burning = 1
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index 364a5af4750..b4a6821c09b 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -141,38 +141,38 @@
if("restore to default")
O.vars[variable] = initial(O.vars[variable])
if(method)
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -212,7 +212,7 @@
//Convert the string vars for anything that's not O
if(method)
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
new_value = pre_processing //reset new_value, ready to convert it uniquely for the next iteration
@@ -227,7 +227,7 @@
M.vars[variable] = new_value
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if ( istype(A , O.type) )
new_value = pre_processing
@@ -242,7 +242,7 @@
A.vars[variable] = new_value
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if ( istype(A , O.type) )
new_value = pre_processing
@@ -257,7 +257,7 @@
A.vars[variable] = new_value
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if (M.type == O.type)
new_value = pre_processing
@@ -272,7 +272,7 @@
M.vars[variable] = new_value
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if (A.type == O.type)
new_value = pre_processing
@@ -287,7 +287,7 @@
A.vars[variable] = new_value
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if (A.type == O.type)
new_value = pre_processing
@@ -313,7 +313,7 @@
O.vars[variable] = new_value
if(method)
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
if(variable=="luminosity")
@@ -322,7 +322,7 @@
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if ( istype(A , O.type) )
if(variable=="luminosity")
@@ -331,7 +331,7 @@
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if ( istype(A , O.type) )
if(variable=="luminosity")
@@ -341,7 +341,7 @@
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if (M.type == O.type)
if(variable=="luminosity")
@@ -350,7 +350,7 @@
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if (A.type == O.type)
if(variable=="luminosity")
@@ -359,7 +359,7 @@
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if (A.type == O.type)
if(variable=="luminosity")
@@ -374,38 +374,38 @@
if(new_value == null) return
O.vars[variable] = new_value
if(method)
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -417,37 +417,37 @@
O.vars[variable] = new_value
if(method)
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O.type, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O.type, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
@@ -458,76 +458,76 @@
if(new_value == null) return
O.vars[variable] = new_value
if(method)
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if ( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
CHECK_TICK
if(method)
- if(istype(O,/mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if(istype(M,O.type))
M.on_varedit(variable)
CHECK_TICK
- else if(istype(O,/obj))
+ else if(isobj(O))
for(var/obj/A in world)
if(istype(A,O.type))
A.on_varedit(variable)
CHECK_TICK
- else if(istype(O,/turf))
+ else if(isturf(O))
for(var/turf/A in block(locate(1,1,1),locate(world.maxx,world.maxy,world.maxz)))
if(istype(A,O.type))
A.on_varedit(variable)
CHECK_TICK
else
- if(istype(O, /mob))
+ if(ismob(O))
for(var/mob/M in mob_list)
if(M.type == O.type)
M.on_varedit(variable)
CHECK_TICK
- else if(istype(O, /obj))
+ else if(isobj(O))
for(var/obj/A in world)
if(A.type == O.type)
A.on_varedit(variable)
CHECK_TICK
- else if(istype(O, /turf))
+ else if(isturf(O))
for(var/turf/A in world)
if(A.type == O.type)
A.on_varedit(variable)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 843edc9bdc2..c48931b2332 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -594,7 +594,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] has gibbed [key_name(M)]")
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]")
- if(istype(M, /mob/dead/observer))
+ if(isobserver(M))
new /obj/effect/gibspawner/generic(M.loc, M.viruses)
return
if(confirm == "Yes")
@@ -1153,3 +1153,17 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
dat += "[S.name] - Announce | Remove "
dat += " Add New Goal"
usr << browse(dat, "window=goals;size=400x400")
+
+
+/client/proc/toggle_hub()
+ set category = "Server"
+ set name = "Toggle Hub"
+
+ world.visibility = (!world.visibility)
+
+ log_admin("[key_name(usr)] has toggled the server's hub status for the round, it is now [(world.visibility?"on":"off")] the hub.")
+ message_admins("[key_name_admin(usr)] has toggled the server's hub status for the round, it is now [(world.visibility?"on":"off")] the hub.")
+ if (world.visibility && !world.reachable)
+ message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.")
+
+ feedback_add_details("admin_verb","HUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 31ecea937bd..833068afdab 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -59,7 +59,7 @@
affecting = H.get_bodypart(type)
H.Stun(3)
if(affecting)
- if(affecting.take_damage(1, 0))
+ if(affecting.receive_damage(1, 0))
H.update_damage_overlays()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 7ce4eba77b1..fff0ba66314 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -69,6 +69,8 @@
if(!istype(location) || !(location.air))
return 0
+ location.active_hotspot = src
+
if(volume > CELL_VOLUME*0.95)
bypassing = 1
else
@@ -87,9 +89,9 @@
location.assume_air(affected)
for(var/A in loc)
- var/atom/item = A
- if(item && item != src) // It's possible that the item is deleted in temperature_expose
- item.fire_act(null, temperature, volume)
+ var/atom/AT = A
+ if(AT && AT != src) // It's possible that the item is deleted in temperature_expose
+ AT.fire_act(temperature, volume)
return 0
@@ -148,7 +150,7 @@
SetLuminosity(0)
SSair.hotspots -= src
DestroyTurf()
- if(istype(loc, /turf))
+ if(isturf(loc))
var/turf/open/T = loc
if(T.active_hotspot == src)
T.active_hotspot = null
@@ -157,8 +159,7 @@
return QDEL_HINT_PUTINPOOL
/obj/effect/hotspot/proc/DestroyTurf()
-
- if(istype(loc, /turf))
+ if(isturf(loc))
var/turf/T = loc
if(T.to_be_destroyed)
var/chance_of_deletion
@@ -175,4 +176,4 @@
/obj/effect/hotspot/Crossed(mob/living/L)
..()
if(isliving(L))
- L.fire_act()
+ L.fire_act(temperature, volume)
diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm
index 30d359d4f40..73c2c7bc4b8 100644
--- a/code/modules/atmospherics/environmental/LINDA_system.dm
+++ b/code/modules/atmospherics/environmental/LINDA_system.dm
@@ -92,7 +92,7 @@
return adjacent_turfs
/atom/proc/air_update_turf(command = 0)
- if(!istype(loc,/turf) && command)
+ if(!isturf(loc) && command)
return
var/turf/T = get_turf(loc)
T.air_update_turf(command)
@@ -103,7 +103,7 @@
SSair.add_to_active(src,command)
/atom/movable/proc/move_update_air(turf/T)
- if(istype(T,/turf))
+ if(isturf(T))
T.air_update_turf(1)
air_update_turf(1)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 9d2c5627bc2..f73dc6b4cc9 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -55,6 +55,11 @@
active_power_usage = 8
power_channel = ENVIRON
req_access = list(access_atmospherics)
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 80
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
+ resistance_flags = 0
var/danger_level = 0
var/mode = AALARM_MODE_SCRUBBING
@@ -628,8 +633,7 @@
if(istype(W, /obj/item/weapon/wirecutters) && panel_open && wires.is_all_cut())
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
user << "You cut the final wires."
- var/obj/item/stack/cable_coil/cable = new /obj/item/stack/cable_coil(loc)
- cable.amount = 5
+ new /obj/item/stack/cable_coil(loc, 5)
buildstage = 1
update_icon()
return
@@ -713,4 +717,17 @@
return
emagged = TRUE
visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.")
- playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1)
\ No newline at end of file
+ playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1)
+
+/obj/machinery/airalarm/obj_break(damage_flag)
+ ..()
+ update_icon()
+
+/obj/machinery/airalarm/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ var/obj/item/I = new /obj/item/weapon/electronics/airalarm(loc)
+ if(!disassembled)
+ I.obj_integrity = I.max_integrity * 0.5
+ new /obj/item/stack/cable_coil(loc, 3)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 0101bd9d415..a3bb43227bc 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -16,6 +16,10 @@ Pipelines + Other Objects -> Pipe network
power_channel = ENVIRON
on_blueprints = TRUE
layer = GAS_PIPE_LAYER //under wires
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
+ obj_integrity = 200
+ max_integrity = 200
var/nodealert = 0
var/can_unwrench = 0
var/initialize_directions = 0
@@ -152,11 +156,10 @@ Pipelines + Other Objects -> Pipe network
//You unwrenched a pipe full of pressure? Let's splat you into the wall, silly.
if(unsafe_wrenching)
unsafe_pressure_release(user, internal_pressure)
- Deconstruct()
+ deconstruct(TRUE)
else
return ..()
-
/obj/machinery/atmospherics/proc/can_unwrench(mob/user)
return can_unwrench
@@ -179,13 +182,16 @@ Pipelines + Other Objects -> Pipe network
user.visible_message("[user] is sent flying by pressure!","The pressure sends you flying!")
user.throw_at(target, range, speed)
-/obj/machinery/atmospherics/Deconstruct()
- if(can_unwrench)
- stored.loc = src.loc
- transfer_fingerprints_to(stored)
- stored = null
-
- qdel(src)
+/obj/machinery/atmospherics/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(can_unwrench)
+ if(stored)
+ stored.forceMove(loc)
+ if(!disassembled)
+ stored.obj_integrity = stored.max_integrity * 0.5
+ transfer_fingerprints_to(stored)
+ stored = null
+ ..()
/obj/machinery/atmospherics/proc/getpipeimage(iconset, iconstate, direction, col=rgb(255,255,255))
@@ -226,7 +232,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct(FALSE)
//Find a connecting /obj/machinery/atmospherics in specified direction
@@ -288,3 +294,9 @@ Pipelines + Other Objects -> Pipe network
//Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it.
/obj/machinery/atmospherics/proc/can_see_pipes()
return 1
+
+/obj/machinery/atmospherics/fire_act(exposed_temperature, exposed_volume)
+ var/turf/T = src.loc
+ if(T && T.intact && level == 1) //protected from fire when hidden behind a floor.
+ return
+ ..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 9ec331734ac..e5c82a06462 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -4,6 +4,9 @@
icon_state = "cell-off"
density = 1
anchored = 1
+ obj_integrity = 350
+ max_integrity = 350
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 30, acid = 30)
var/on = FALSE
state_open = FALSE
@@ -50,9 +53,16 @@
conduction_coefficient = initial(conduction_coefficient) * C
/obj/machinery/atmospherics/components/unary/cryo_cell/Destroy()
- beaker = null
+ if(beaker)
+ qdel(beaker)
+ beaker = null
return ..()
+/obj/machinery/atmospherics/components/unary/cryo_cell/on_deconstruction()
+ if(beaker)
+ beaker.forceMove(loc)
+ beaker = null
+
/obj/machinery/atmospherics/components/unary/cryo_cell/update_icon()
if(panel_open)
icon_state = "cell-o"
@@ -137,7 +147,7 @@
on = FALSE
..()
if(beaker)
- beaker.loc = src
+ beaker.forceMove(src)
/obj/machinery/atmospherics/components/unary/cryo_cell/close_machine(mob/living/carbon/user)
if((isnull(user) || istype(user)) && state_open && !panel_open)
@@ -253,7 +263,7 @@
. = TRUE
if("ejectbeaker")
if(beaker)
- beaker.loc = loc
+ beaker.forceMove(loc)
beaker = null
. = TRUE
update_icon()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index cee595c5466..af070c4091b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -4,6 +4,8 @@
icon_state = "generic"
name = "pressure tank"
desc = "A large vessel containing pressurized gas."
+ obj_integrity = 800
+ max_integrity = 800
var/volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
density = 1
var/gas_type = 0
@@ -46,4 +48,4 @@
var/datum/gas_mixture/air_contents = AIR1
air_contents.assert_gases("o2", "n2")
air_contents.gases["o2"][MOLES] = AIR_CONTENTS * 0.2
- air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8
\ No newline at end of file
+ air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 74a0a279188..2a62684c873 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -6,6 +6,9 @@
var/icon_state_open = "cold_off"
density = TRUE
anchored = TRUE
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30)
var/on = FALSE
var/min_temperature = 0
diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm
index a4e0d60541b..b0116712833 100644
--- a/code/modules/atmospherics/machinery/datum_pipeline.dm
+++ b/code/modules/atmospherics/machinery/datum_pipeline.dm
@@ -144,7 +144,7 @@ var/pipenetwarnings = 10
var/target_temperature
var/target_heat_capacity
- if(istype(target, /turf/open))
+ if(isopenturf(target))
var/turf/open/modeled_location = target
target_temperature = modeled_location.GetTemperature()
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index 4f94c2a2b4e..4bde239d26c 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -11,6 +11,10 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 4
+ obj_integrity = 150
+ max_integrity = 150
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 40, acid = 0)
+
/obj/machinery/meter/New()
..()
diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm
index fa191981832..0df9d17410e 100644
--- a/code/modules/atmospherics/machinery/other/zvent.dm
+++ b/code/modules/atmospherics/machinery/other/zvent.dm
@@ -20,7 +20,7 @@
/obj/machinery/zvent/process_atmos()
//all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
- if (istype(loc,/turf)) //if we're not on a valid turf, forget it
+ if(isturf(loc)) //if we're not on a valid turf, forget it
for (var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented
var/turf/open/zturf_conn = locate(x,y,z+new_z)
if (istype(zturf_conn))
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
index 9585fb6b8fb..8f6467cd09a 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
@@ -1,4 +1,4 @@
-/obj/machinery/atmospherics/pipe/heat_exchanging/
+/obj/machinery/atmospherics/pipe/heat_exchanging
icon = 'icons/obj/atmospherics/pipes/heat.dmi'
level = 2
var/initialize_directions_he
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index fc412840ebe..32803711f95 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -38,7 +38,7 @@
..()
/obj/machinery/atmospherics/pipe/hide(i)
- if(level == 1 && istype(loc, /turf))
+ if(level == 1 && isturf(loc))
invisibility = i ? INVISIBILITY_MAXIMUM : 0
update_icon()
@@ -97,4 +97,9 @@
N.update_icon()
/obj/machinery/atmospherics/pipe/returnPipenets()
- . = list(parent)
\ No newline at end of file
+ . = list(parent)
+
+/obj/machinery/atmospherics/pipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 12)
+ return 0
+ . = ..()
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index df48ca85a8d..0e722acfba4 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -17,8 +17,10 @@
var/gas_type = ""
var/release_pressure = ONE_ATMOSPHERE
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 0)
- var/health = 100
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 80, acid = 50)
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 100
pressure_resistance = 7 * ONE_ATMOSPHERE
var/temperature_resistance = 1000 + T0C
var/starter_temp
@@ -182,40 +184,56 @@
/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > temperature_resistance)
- take_damage(5, BRUTE, 0)
+ take_damage(5, BURN, 0)
-/obj/machinery/portable_atmospherics/canister/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ canister_break()
+ if(disassembled)
+ new /obj/item/stack/sheet/metal (loc, 10)
else
- return
- if(stat & BROKEN)
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
+/obj/machinery/portable_atmospherics/canister/attackby(obj/item/weapon/W, mob/user, params)
+ if(user.a_intent != "harm" && istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(stat & BROKEN)
+ if(!WT.remove_fuel(0, user))
+ return
+ playsound(loc, 'sound/items/Welder.ogg', 40, 1)
+ user << "You begin cutting [src] apart..."
+ if(do_after(user, 30, target = src))
+ deconstruct(TRUE)
+ else
+ user << "You cannot slice [src] apart when it isn't broken."
+ return 1
+ else
+ return ..()
+
+/obj/machinery/portable_atmospherics/canister/obj_break(damage_flag)
+ if((stat & BROKEN) || (flags & NODECONSTRUCT))
return
- health = max( health - damage, 0)
- if(!health)
- disconnect()
- var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles())
- var/turf/T = get_turf(src)
- T.assume_air(expelled_gas)
- air_update_turf()
+ canister_break()
- stat |= BROKEN
- density = 0
- playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
- update_icon()
- investigate_log("was destroyed.", "atmos")
+/obj/machinery/portable_atmospherics/canister/proc/canister_break()
+ disconnect()
+ var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles())
+ var/turf/T = get_turf(src)
+ T.assume_air(expelled_gas)
+ air_update_turf()
- if(holding)
- holding.loc = T
- holding = null
+ stat |= BROKEN
+ density = 0
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
+ update_icon()
+ investigate_log("was destroyed.", "atmos")
+
+ if(holding)
+ holding.forceMove(T)
+ holding = null
/obj/machinery/portable_atmospherics/canister/process_atmos()
..()
@@ -236,39 +254,6 @@
air_update_turf() // Update the environment if needed.
update_icon()
-/obj/machinery/portable_atmospherics/canister/blob_act(obj/structure/blob/B)
- take_damage(100, BRUTE, 0)
-
-/obj/machinery/portable_atmospherics/canister/burn()
- take_damage(health, BURN, 1)
- ..()
-
-/obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage / 2, P.damage_type, 0)
-
-/obj/machinery/portable_atmospherics/canister/ex_act(severity, target)
- switch(severity)
- if(1)
- if((stat & BROKEN) || prob(30))
- qdel(src)
- else
- take_damage(100, BRUTE, 0)
- if(2)
- if(stat & BROKEN)
- qdel(src)
- else
- take_damage(rand(40, 110), BRUTE, 0)
- if(3)
- take_damage(rand(15, 40), BRUTE, 0)
-
-/obj/machinery/portable_atmospherics/canister/attacked_by(obj/item/I, mob/user)
- if(I.force)
- user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!")
- investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos")
- add_fingerprint(user)
- take_damage(I.force, I.damtype, 1)
-
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 11e65a78165..49baa0e1bf4 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -2,6 +2,10 @@
name = "portable_atmospherics"
icon = 'icons/obj/atmos.dmi'
use_power = 0
+ obj_integrity = 250
+ max_integrity = 250
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 60, acid = 30)
+
var/datum/gas_mixture/air_contents
var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port
@@ -106,4 +110,12 @@
else if(istype(W, /obj/item/device/analyzer) && Adjacent(user))
atmosanalyzer_scan(air_contents, user)
else
- return ..()
\ No newline at end of file
+ return ..()
+
+/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user)
+ if(I.force < 10 && !(stat & BROKEN))
+ take_damage(0)
+ else
+ investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos")
+ add_fingerprint(user)
+ ..()
\ No newline at end of file
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
index 7a489bfe815..4da89a01bc2 100644
--- a/code/modules/awaymissions/bluespaceartillery.dm
+++ b/code/modules/awaymissions/bluespaceartillery.dm
@@ -12,8 +12,8 @@
anchored = 1
/obj/machinery/artillerycontrol/process()
- if(src.reload[src] breaks down!")
icon_state = "forge_off"
STOP_PROCESSING(SSobj, src)
- broken = 1
-
-/obj/structure/academy_wizard_spawner/attackby(obj/item/weapon/W, mob/living/user, params)
- add_fingerprint(user)
- user.changeNext_move(CLICK_CD_MELEE)
- if(!broken)
- health -= W.force
- update_status()
- ..()
-
-/obj/structure/academy_wizard_spawner/bullet_act(obj/item/projectile/Proj)
- if(!broken)
- if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- health -= Proj.damage
- update_status()
- ..()
- return
/datum/outfit/wizard/academy
name = "Academy Wizard"
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index 2f386c471e2..7fbb1dc0f47 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -62,7 +62,7 @@
active = FALSE
toggleFirepit()
-/obj/structure/firepit/fire_act()
+/obj/structure/firepit/fire_act(exposed_temperature, exposed_volume)
if(!active)
active = TRUE
toggleFirepit()
diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm
index 75d240ec777..329978827af 100644
--- a/code/modules/awaymissions/mission_code/challenge.dm
+++ b/code/modules/awaymissions/mission_code/challenge.dm
@@ -22,6 +22,7 @@
icon_state = "emitter"
anchored = 1
density = 1
+ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF
use_power = 0
idle_power_usage = 0
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index e213e8e3e3c..cfcca70e208 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -175,7 +175,7 @@ var/sc_safecode5 = "[rand(0,9)]"
/obj/singularity/narsie/sc_Narsie/consume(atom/A)
if(is_type_in_list(A, uneatable))
return 0
- if (istype(A,/mob/living))
+ if(isliving(A))
var/mob/living/L = A
L.gib()
else if(istype(A,/obj/))
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index a5d07bdc5bb..d6cb20e57e3 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -58,7 +58,7 @@
user << "The Wish Granter lies silent."
return
- else if(!istype(user, /mob/living/carbon/human))
+ else if(!ishuman(user))
user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's."
return
@@ -121,15 +121,15 @@
icon_state = "blobpod"
var/triggered = 0
-/obj/effect/meatgrinder/Crossed(AM as mob|obj)
+/obj/effect/meatgrinder/Crossed(AM)
Bumped(AM)
-/obj/effect/meatgrinder/Bumped(mob/M as mob|obj)
+/obj/effect/meatgrinder/Bumped(mob/M)
if(triggered)
return
- if(istype(M, /mob/living/carbon/human) && M.stat != DEAD && M.ckey)
+ if(ishuman(M) && M.stat != DEAD && M.ckey)
for(var/mob/O in viewers(world.view, src.loc))
visible_message("[M] triggered the [src]!")
triggered = 1
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 3b61fb2dedb..bae87ba87b2 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -147,11 +147,11 @@
prefs.save_preferences()
if(prefs.toggles & SOUND_LOBBY)
src << "You will now hear music in the game lobby."
- if(istype(mob, /mob/new_player))
+ if(isnewplayer(mob))
playtitlemusic()
else
src << "You will no longer hear music in the game lobby."
- if(istype(mob, /mob/new_player))
+ if(isnewplayer(mob))
mob.stopLobbySound()
feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -244,7 +244,7 @@ var/global/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost",
if(new_form)
prefs.ghost_form = new_form
prefs.save_preferences()
- if(istype(mob,/mob/dead/observer))
+ if(isobserver(mob))
var/mob/dead/observer/O = mob
O.update_icon(new_form)
@@ -258,7 +258,7 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
if(new_orbit)
prefs.ghost_orbit = new_orbit
prefs.save_preferences()
- if(istype(mob, /mob/dead/observer))
+ if(isobserver(mob))
var/mob/dead/observer/O = mob
O.ghost_orbit = new_orbit
@@ -273,7 +273,7 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
if("default sprites")
prefs.ghost_accs = GHOST_ACCS_NONE
prefs.save_preferences()
- if(istype(mob, /mob/dead/observer))
+ if(isobserver(mob))
var/mob/dead/observer/O = mob
O.update_icon()
@@ -306,7 +306,7 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
if("White Ghost")
prefs.ghost_others = GHOST_OTHERS_SIMPLE
prefs.save_preferences()
- if(istype(mob, /mob/dead/observer))
+ if(isobserver(mob))
var/mob/dead/observer/O = mob
O.updateghostsight()
@@ -334,7 +334,7 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
prefs.ghost_hud = !prefs.ghost_hud
src << "Ghost HUD will now be [prefs.ghost_hud ? "visible" : "hidden"]."
prefs.save_preferences()
- if(istype(mob,/mob/dead/observer))
+ if(isobserver(mob))
mob.hud_used.show_hud()
/client/verb/toggle_inquisition() // warning: unexpected inquisition
diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm
index a6e5411a8bc..48d7d6f1872 100644
--- a/code/modules/client/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -68,7 +68,7 @@
if(isobserver(C.mob))
msg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
+ else if(isnewplayer(C.mob))
msg += " - Lobby"
else
msg += " - Playing"
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index b57b4ad5927..8068b0ea9aa 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -159,8 +159,8 @@
origin_tech = "syndicate=2"
sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle??
random_sensor = 0
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/under/chameleon/New()
..()
@@ -176,8 +176,8 @@
item_state = "armor"
blood_overlay_type = "armor"
origin_tech = "syndicate=2"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/chameleon/New()
..()
@@ -192,8 +192,8 @@
icon_state = "meson"
item_state = "meson"
origin_tech = "syndicate=2"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/glasses/chameleon/New()
..()
@@ -208,8 +208,8 @@
icon_state = "yellow"
item_state = "ygloves"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/gloves/chameleon/New()
..()
@@ -224,8 +224,8 @@
icon_state = "greysoft"
item_color = "grey"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
var/datum/action/item_action/chameleon/change/chameleon_action = null
@@ -256,8 +256,8 @@
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
item_state = "gas_alt"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
@@ -307,9 +307,9 @@
permeability_coefficient = 0.05
flags = NOSLIP
origin_tech = "syndicate=2"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
pockets = /obj/item/weapon/storage/internal/pocket/shoes
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/shoes/chameleon/New()
..()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index b3301d68acc..b10df45b782 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -1,6 +1,10 @@
/obj/item/clothing
name = "clothing"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
+ obj_integrity = 150
+ max_integrity = 150
+ integrity_failure = 80
+ var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var
var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets
@@ -59,6 +63,13 @@
return ..()
/obj/item/clothing/attackby(obj/item/W, mob/user, params)
+ if(damaged_clothes && istype(W, /obj/item/stack/sheet/cloth))
+ var/obj/item/stack/sheet/cloth/C = W
+ C.use(1)
+ update_clothes_damaged_state(FALSE)
+ obj_integrity = max_integrity
+ user << "You fix the damages on [src] with [C]."
+ return 1
if(pockets)
return pockets.attackby(W, user, params)
else
@@ -110,6 +121,34 @@
user.vars[variable] = user_vars_to_edit[variable]
+/obj/item/clothing/examine(mob/user)
+ ..()
+ if(damaged_clothes)
+ user << "It looks damaged!"
+
+/obj/item/clothing/obj_break(damage_flag)
+ if(!damaged_clothes)
+ update_clothes_damaged_state(TRUE)
+
+var/list/damaged_clothes_icons = list()
+
+/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
+ var/index = "\ref[initial(icon)]-[initial(icon_state)]"
+ if(damaging)
+ damaged_clothes = 1
+ var/icon/damaged_clothes_icon = damaged_clothes_icons[index]
+ if(!damaged_clothes_icon)
+ damaged_clothes_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply damaged effect to the initial icon_state for each object
+ damaged_clothes_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
+ damaged_clothes_icon.Blend(icon('icons/effects/item_damage.dmi', "itemdamaged"), ICON_MULTIPLY) //adds damage effect and the remaining white areas become transparant
+ damaged_clothes_icon = fcopy_rsc(damaged_clothes_icon)
+ damaged_clothes_icons[index] = damaged_clothes_icon
+ add_overlay(damaged_clothes_icon, 1)
+ else
+ damaged_clothes = 0
+ overlays -= damaged_clothes_icons[index]
+ priority_overlays -= damaged_clothes_icons[index]
+
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
@@ -117,7 +156,7 @@
w_class = 1
throwforce = 0
slot_flags = SLOT_EARS
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/ears/earmuffs
name = "earmuffs"
@@ -127,7 +166,7 @@
flags = EARBANGPROTECT
strip_delay = 15
put_on_delay = 25
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
//Glasses
/obj/item/clothing/glasses
@@ -145,7 +184,7 @@
var/vision_correction = 0 //does wearing these glasses correct some of our vision defects?
strip_delay = 20
put_on_delay = 25
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
@@ -175,9 +214,17 @@ BLIND // can't see anything
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedgloves")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands")
+/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_gloves()
+
// Called just before an attack_hand(), in mob/UnarmedAttack()
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
return 0 // return 1 to cancel attack_hand()
@@ -195,9 +242,18 @@ BLIND // can't see anything
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedhelmet")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="helmetblood")
+/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_head()
+
+
//Mask
/obj/item/clothing/mask
name = "mask"
@@ -213,8 +269,18 @@ BLIND // can't see anything
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
- if(blood_DNA && (body_parts_covered & HEAD))
- . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
+ if(body_parts_covered & HEAD)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedmask")
+ if(blood_DNA)
+ . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
+
+/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_wear_mask()
+
//Override this to modify speech like luchador masks.
/obj/item/clothing/mask/proc/speechModification(message)
@@ -276,9 +342,16 @@ BLIND // can't see anything
else
bloody = bloody_shoes[BLOOD_STATE_HUMAN]
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedshoe")
if(bloody)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="shoeblood")
+/obj/item/clothing/shoes/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_shoes()
/obj/item/clothing/shoes/clean_blood()
..()
@@ -306,9 +379,17 @@ BLIND // can't see anything
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damaged[blood_overlay_type]")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="[blood_overlay_type]blood")
+/obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_wear_suit()
+
//Spacesuit
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
// Meaning the the suit is defined directly after the corrisponding helmet. Just like below!
@@ -319,7 +400,7 @@ BLIND // can't see anything
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
item_state = "spaceold"
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 0, acid = 70)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 80, acid = 70)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -329,7 +410,7 @@ BLIND // can't see anything
strip_delay = 50
put_on_delay = 50
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/space
name = "space suit"
@@ -343,7 +424,7 @@ BLIND // can't see anything
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals)
slowdown = 1
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 0, acid = 70)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 80, acid = 70)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
@@ -351,7 +432,7 @@ BLIND // can't see anything
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
strip_delay = 80
put_on_delay = 80
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
//Under clothing
@@ -376,6 +457,9 @@ BLIND // can't see anything
. = list()
if(!isinhands)
+
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damageduniform")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="uniformblood")
if(hastie)
@@ -387,6 +471,11 @@ BLIND // can't see anything
tI.color = hastie.color
. += tI
+/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_w_uniform()
/obj/item/clothing/under/New()
if(random_sensor)
@@ -409,6 +498,13 @@ BLIND // can't see anything
adjusted = DIGITIGRADE_STYLE
H.update_inv_w_uniform()
+ if(hastie)
+ hastie.on_uniform_equip(src, user)
+
+/obj/item/clothing/under/dropped(mob/user)
+ if(hastie)
+ hastie.on_uniform_dropped(src, user)
+ ..()
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if(!attachTie(I, user))
@@ -430,7 +526,7 @@ BLIND // can't see anything
if(user && notifyAttach)
user << "You attach [I] to [src]."
- if(istype(loc, /mob/living/carbon/human))
+ if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
@@ -450,14 +546,18 @@ BLIND // can't see anything
else
user << "You detach [T] from [src] and it falls on the floor."
- if(istype(loc, /mob/living/carbon/human))
+ if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
/obj/item/clothing/under/examine(mob/user)
..()
- switch(src.sensor_mode)
+ if(adjusted == ALT_STYLE)
+ user << "Alt-click on [src] to wear it normally."
+ else
+ user << "Alt-click on [src] to wear it casually."
+ switch(sensor_mode)
if(0)
user << "Its sensors appear to be disabled."
if(1)
@@ -510,7 +610,7 @@ BLIND // can't see anything
if(3)
usr << "Your suit will now report your exact vital lifesigns as well as your coordinate position."
- if(istype(loc,/mob/living/carbon/human))
+ if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.w_uniform == src)
H.update_suit_sensors()
@@ -566,13 +666,6 @@ BLIND // can't see anything
body_parts_covered |= CHEST
return adjusted
-/obj/item/clothing/under/examine(mob/user)
- ..()
- if(src.adjusted == ALT_STYLE)
- user << "Alt-click on [src] to wear it normally."
- else
- user << "Alt-click on [src] to wear it casually."
-
/obj/item/clothing/proc/weldingvisortoggle() //Malk: proc to toggle welding visors on helmets, masks, goggles, etc.
if(!can_use(usr))
return
@@ -598,3 +691,14 @@ BLIND // can't see anything
if(!user.incapacitated())
return 1
return 0
+
+
+/obj/item/clothing/obj_destruction(damage_flag)
+ if(damage_flag == "bomb" || damage_flag == "melee")
+ var/turf/T = get_turf(src)
+ spawn(1) //so the shred survives potential turf change from the explosion.
+ var/obj/effect/decal/cleanable/shreds/Shreds = new(T)
+ Shreds.desc = "The sad remains of what used to be [name]."
+ deconstruct(FALSE)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 5f9df788728..a44178fc92f 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -42,7 +42,7 @@
if(!mode)
return
- if(!istype(loc,/mob/living/carbon/human))
+ if(!ishuman(loc))
invis_update()
return
@@ -78,7 +78,7 @@
O.invisibility = INVISIBILITY_MAXIMUM
/obj/item/clothing/glasses/meson/engine/proc/t_ray_on()
- if(!istype(loc,/mob/living/carbon/human))
+ if(!ishuman(loc))
return 0
var/mob/living/carbon/human/user = loc
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 05206e37108..2f94584d2e3 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -56,7 +56,8 @@
scan_reagents = 1 //You can see reagents while wearing science goggles
actions_types = list(/datum/action/item_action/toggle_research_scanner)
glass_colour_type = /datum/client_colour/glass_colour/purple
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 100)
/obj/item/clothing/glasses/science/item_action_slot_check(slot)
if(slot == slot_glasses)
@@ -127,11 +128,7 @@
icon_state = "hipster_glasses"
item_state = "hipster_glasses"
-/obj/item/clothing/glasses/gglasses
- name = "Green Glasses"
- desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
- icon_state = "gglasses"
- item_state = "gglasses"
+//Here lies green glasses, so ugly they died. RIP
/obj/item/clothing/glasses/sunglasses
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 8dc34e005c4..ec0cec172db 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -6,7 +6,7 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
item_color="yellow"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
@@ -16,7 +16,7 @@
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
permeability_coefficient = 0.05
item_color="yellow"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/fyellow/New()
..()
@@ -32,7 +32,7 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
var/can_be_cut = 1
/obj/item/clothing/gloves/color/black/hos
@@ -70,7 +70,7 @@
desc = "These gloves will protect the wearer from electric shock."
siemens_coefficient = 0
permeability_coefficient = 0.05
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/rainbow
name = "rainbow gloves"
@@ -146,6 +146,7 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 60
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 50)
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
@@ -156,7 +157,7 @@
permeability_coefficient = 0.01
item_color="white"
transfer_prints = TRUE
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 47e4f799474..e3b688e9cb4 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -21,8 +21,8 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 30)
+ resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 30)
/obj/item/clothing/gloves/combat
name = "combat gloves"
@@ -36,8 +36,8 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 50)
+ resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
/obj/item/clothing/gloves/bracer
@@ -53,5 +53,5 @@
cold_protection = ARMS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
armor = list(melee = 15, bullet = 35, laser = 35, energy = 20, bomb = 35, bio = 35, rad = 35, fire = 0, acid = 0)
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 5e61b69a2eb..70dfabdcfcb 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -68,7 +68,7 @@
desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
@@ -137,11 +137,11 @@
desc = "Go Red! I mean Green! I mean Red! No Green!"
icon_state = "thunderdome"
item_state = "thunderdome"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/collectable/swat
name = "collectable SWAT helmet"
desc = "That's not real blood. That's red paint." //Reference to the actual description
icon_state = "swat"
item_state = "swat"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 7ea5150f4d1..1d9d2da01a1 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -6,7 +6,7 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite)
- armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20, fire = 0, acid = 50)
+ armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20, fire = 100, acid = 50)
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index a69289080ce..65c6ab20bc6 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -4,14 +4,14 @@
icon_state = "helmet"
flags = HEADBANGPROTECT
item_state = "helmet"
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
flags_cover = HEADCOVERSEYES
dog_fashion = /datum/dog_fashion/head/helmet
@@ -20,9 +20,6 @@
/obj/item/clothing/head/helmet/New()
..()
-/obj/item/clothing/head/helmet/emp_act(severity)
- ..()
-
/obj/item/clothing/head/helmet/sec
can_flashlight = 1
@@ -31,7 +28,7 @@
desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "helmetalt"
item_state = "helmetalt"
- armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0, fire = 50, acid = 50)
can_flashlight = 1
dog_fashion = null
@@ -48,7 +45,7 @@
alt_toggle_message = "You push the visor up on"
can_toggle = 1
flags = HEADBANGPROTECT
- armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0, fire = 50, acid = 50)
flags_inv = HIDEEARS|HIDEFACE
strip_delay = 80
actions_types = list(/datum/action/item_action/toggle)
@@ -102,7 +99,7 @@
desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern."
icon_state = "swatsyndie"
item_state = "swatsyndie"
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 20, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 50, acid = 50)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -123,7 +120,7 @@
flags_inv = HIDEEARS|HIDEHAIR
icon_state = "thunderdome"
item_state = "thunderdome"
- armor = list(melee = 40, bullet = 30, laser = 25,energy = 10, bomb = 25, bio = 10, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 25,energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 50)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -136,7 +133,8 @@
desc = "An ancient helmet made of bronze and leather."
flags_inv = HIDEEARS|HIDEHAIR
flags_cover = HEADCOVERSEYES
- armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
icon_state = "roman"
item_state = "roman"
strip_delay = 100
@@ -212,7 +210,7 @@
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES
- armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20, fire = 20, acid = 20)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20, fire = 40, acid = 20)
icon_state = "skull"
item_state = "skull"
strip_delay = 100
@@ -230,7 +228,7 @@
icon_state = state
- if(istype(loc, /mob/living/carbon/human))
+ if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_head()
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index f013c37db74..ebde71d8005 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -26,7 +26,7 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/captain
@@ -44,7 +44,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
dog_fashion = /datum/dog_fashion/head/hop
//Chaplain
@@ -59,7 +59,7 @@
name = "detective's fedora"
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
icon_state = "detective"
- armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50)
var/candy_cooldown = 0
pockets = /obj/item/weapon/storage/internal/pocket/small/detective
dog_fashion = /datum/dog_fashion/head/detective
@@ -96,7 +96,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 0, acid = 60)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 60)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
@@ -108,7 +108,7 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 60)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 30, acid = 60)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/warden
@@ -116,7 +116,7 @@
name = "security beret"
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficent protection."
icon_state = "beret_badge"
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
strip_delay = 60
dog_fashion = null
@@ -129,7 +129,7 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
- armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 30, acid = 50)
strip_delay = 60
/obj/item/clothing/head/beret/sec/navyofficer
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 4ebcd8a4a27..b61d1c18f5a 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -6,7 +6,7 @@
desc = "It's good to be emperor."
item_state = "that"
flags_inv = 0
- armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
strip_delay = 80
/obj/item/clothing/head/powdered_wig
@@ -222,7 +222,7 @@
throw_range = 5
w_class = 2
attack_verb = list("warned", "cautioned", "smashed")
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/santa
name = "santa hat"
@@ -264,7 +264,8 @@
name = "crown"
desc = "A crown fit for a king, a petty king maybe."
icon_state = "crown"
- armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/crown/fancy
name = "magnificent crown"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 6d623c22c39..509120945f4 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -21,7 +21,7 @@
// var/up = 0
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 60)
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 60)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
@@ -63,7 +63,7 @@
if(M.is_holding(src) || M.head == src)
location = M.loc
- if (istype(location, /turf))
+ if(isturf(location))
location.hotspot_expose(700, 1)
/obj/item/clothing/head/hardhat/cakehat/turn_on()
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index eb52e83640f..4aac0629f34 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -120,7 +120,7 @@
desc = "It's a robust baseball hat in tasteful red colour."
icon_state = "secsoft"
item_color = "sec"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
strip_delay = 60
dog_fashion = null
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 7c79e261c96..115ab7bd6ed 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -12,7 +12,7 @@
actions_types = list(/datum/action/item_action/adjust)
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/mask/breath/attack_self(mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 7ba9af72bf7..48cc4e4c238 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -9,7 +9,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
// **** Welding gas mask ****
@@ -20,13 +20,14 @@
materials = list(MAT_METAL=4000, MAT_GLASS=2000)
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 55)
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 55)
origin_tech = "materials=2;engineering=3"
actions_types = list(/datum/action/item_action/toggle)
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = MASKCOVERSEYES
visor_flags_inv = HIDEEYES
visor_flags_cover = MASKCOVERSEYES
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/mask/gas/welding/attack_self()
toggle()
@@ -61,7 +62,7 @@
icon_state = "clown"
item_state = "clown_hat"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
dog_fashion = /datum/dog_fashion/head/clown
@@ -93,7 +94,7 @@
icon_state = "sexyclown"
item_state = "sexyclown"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/mime
name = "mime mask"
@@ -102,7 +103,7 @@
icon_state = "mime"
item_state = "mime"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
/obj/item/clothing/mask/gas/mime/attack_self(mob/user)
@@ -132,7 +133,7 @@
icon_state = "monkeymask"
item_state = "monkeymask"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
@@ -141,7 +142,7 @@
icon_state = "sexymime"
item_state = "sexymime"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/death_commando
name = "Death Commando Mask"
@@ -152,7 +153,7 @@
name = "cyborg visor"
desc = "Beep boop."
icon_state = "death"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/owl_mask
name = "owl mask"
@@ -160,7 +161,7 @@
icon_state = "owl"
flags = MASKINTERNALS
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/carp
name = "carp mask"
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 74113da31e8..bfe675748d6 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -69,7 +69,7 @@
set category = "Object"
set name = "HALT"
set src in usr
- if(!istype(usr, /mob/living))
+ if(!isliving(usr))
return
if(!can_use(usr))
return
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 03e8fd31c83..15abf2b8940 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -28,7 +28,7 @@
visor_flags_cover = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0, fire = 0, acid = 0)
actions_types = list(/datum/action/item_action/adjust)
/obj/item/clothing/mask/surgical/attack_self(mob/user)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 4fc5182db7c..c5f6436a484 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -17,9 +17,9 @@
desc = "High speed, low drag combat boots."
icon_state = "jackboots"
item_state = "jackboots"
- armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0, fire = 70, acid = 50)
strip_delay = 70
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
pockets = /obj/item/weapon/storage/internal/pocket/shoes
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
@@ -27,7 +27,7 @@
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30, fire = 90, acid = 50)
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
@@ -51,8 +51,8 @@
slowdown = SHOES_SLOWDOWN+1
strip_delay = 50
put_on_delay = 50
- resistance_flags = FIRE_PROOF
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 75)
+ resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 75)
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
@@ -90,7 +90,7 @@
item_color = "hosred"
strip_delay = 50
put_on_delay = 50
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
pockets = /obj/item/weapon/storage/internal/pocket/shoes
/obj/item/clothing/shoes/jackboots/fast
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index be717658e23..17142d8bb46 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -4,7 +4,8 @@
icon_state = "chronohelmet"
item_state = "chronohelmet"
slowdown = 1
- armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 95, acid = 95)
+ armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/clothing/suit/space/chronos/suit = null
/obj/item/clothing/head/helmet/space/chronos/dropped()
@@ -23,7 +24,8 @@
icon_state = "chronosuit"
item_state = "chronosuit"
actions_types = list(/datum/action/item_action/toggle)
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 95, acid = 95)
+ armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 1000)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun)
var/list/hands_nodrop = list()
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 37a2973c461..c09fdb06c03 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -4,6 +4,8 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
+ obj_integrity = 200
+ max_integrity = 200
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
var/basestate = "hardsuit"
var/brightness_on = 4 //luminosity when on
@@ -80,6 +82,7 @@
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
var/obj/item/weapon/tank/jetpack/suit/jetpack = null
+
/obj/item/clothing/suit/space/hardsuit/New()
if(jetpack && ispath(jetpack))
jetpack = new jetpack(src)
@@ -142,16 +145,18 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 100, acid = 75)
item_color = "engineering"
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/space/hardsuit/engine
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
- armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 100, acid = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
+ resistance_flags = FIRE_PROOF
//Atmospherics
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
@@ -319,7 +324,7 @@
alt_desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
- armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 95, acid = 100)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 100, acid = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
visor_flags_inv = 0
@@ -335,7 +340,7 @@
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
- armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 95, acid = 100)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 100, acid = 100)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -414,7 +419,7 @@
desc = "A prototype helmet designed for research in a hazardous, low pressure environment. Scientific data flashes across the visor."
icon_state = "hardsuit0-rd"
item_color = "rd"
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
var/onboard_hud_enabled = 0 //stops conflicts with another diag HUD
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 100, bio = 100, rad = 60, fire = 60, acid = 80)
@@ -495,7 +500,8 @@
icon_state = "capspace"
item_state = "capspacehelmet"
desc = "A special hardsuit helmet designed for only the most fashionable of military figureheads."
- armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 95)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
actions_types = list()
/obj/item/clothing/head/helmet/space/hardsuit/captain/attack_self()
@@ -507,7 +513,8 @@
icon_state = "caparmor"
item_state = "capspacesuit"
allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 95)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/captain
//Clown
@@ -545,7 +552,7 @@
icon_state = "hardsuit-hos"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50, fire = 95, acid = 100)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50, fire = 100, acid = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/current_charges = 3
var/max_charges = 3 //How many charges total the shielding has
@@ -585,7 +592,7 @@
playsound(loc, 'sound/machines/ding.ogg', 50, 1)
STOP_PROCESSING(SSobj, src)
shield_state = "[shield_on]"
- if(istype(loc, /mob/living/carbon/human))
+ if(ishuman(loc))
var/mob/living/carbon/human/C = loc
C.update_inv_wear_suit()
@@ -662,7 +669,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
- armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 95, acid = 100)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 100, acid = 100)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
slowdown = 0
@@ -678,7 +685,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 95, acid = 100)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 100, acid = 100)
///SWAT version
/obj/item/clothing/suit/space/hardsuit/shielded/swat
@@ -690,10 +697,9 @@
max_charges = 4
current_charges = 4
recharge_delay = 15
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 95, acid = 95)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF | ACID_PROOF
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat
dog_fashion = /datum/dog_fashion/back/deathsquad
@@ -703,8 +709,7 @@
icon_state = "deathsquad"
item_state = "deathsquad"
item_color = "syndi"
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 95, acid = 95)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
- resistance_flags = ACID_PROOF
actions_types = list()
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 895b1ef9dc1..afea89290f2 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -49,7 +49,7 @@ Contains:
icon_state = "heavy"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat)
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 60, acid = 75)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 100, acid = 100)
strip_delay = 120
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -59,7 +59,7 @@ Contains:
icon_state = "beret_badge"
flags = STOPSPRESSUREDMAGE
flags_inv = 0
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 80, acid = 80)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -74,7 +74,7 @@ Contains:
flags_inv = 0
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 80, acid = 80)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index fedbd537c0b..fc09409ff9e 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -5,7 +5,8 @@
name = "plasmaman suit"
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 95, acid = 75)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 75)
+ resistance_flags = FIRE_PROOF
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish = 0
@@ -41,5 +42,7 @@
item_color = "plasma" //needed for the helmet lighting
item_state = "plasmaman-helm"
strip_delay = 80
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 75)
+ resistance_flags = FIRE_PROOF
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 18bc250016c..1fbde88b1ce 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -7,8 +7,10 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
strip_delay = 60
put_on_delay = 40
- resistance_flags = FIRE_PROOF
- armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ obj_integrity = 200
+ max_integrity = 200
+ resistance_flags = 0
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/armor/vest
name = "armor"
@@ -16,7 +18,7 @@
icon_state = "armoralt"
item_state = "armoralt"
blood_overlay_type = "armor"
- armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 75)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 75)
dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/alt
@@ -34,7 +36,7 @@
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 90)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 70, acid = 90)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
strip_delay = 80
@@ -56,7 +58,7 @@
cold_protection = CHEST|GROIN|ARMS|HANDS
heat_protection = CHEST|GROIN|ARMS|HANDS
strip_delay = 70
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = null
/obj/item/clothing/suit/armor/vest/warden/alt
@@ -80,8 +82,9 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
- armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 90, acid = 90)
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 100, acid = 90)
dog_fashion = null
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/armor/vest/capcarapace/alt
name = "captain's parade jacket"
@@ -127,7 +130,8 @@
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
+ armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone)
@@ -141,7 +145,7 @@
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton/telescopic)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = null
@@ -155,7 +159,7 @@
icon_state = "reactiveoff"
item_state = "reactiveoff"
blood_overlay_type = "armor"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
actions_types = list(/datum/action/item_action/toggle)
resistance_flags = FIRE_PROOF | ACID_PROOF
hit_reaction_chance = 50
@@ -341,7 +345,7 @@
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 95, acid = 95)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 90, acid = 90)
/obj/item/clothing/suit/armor/heavy
name = "heavy armor"
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 9a7c584f968..28ebe2f9f39 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -7,7 +7,7 @@
flags = THICKMATERIAL
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20, fire = 30, acid = 100)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/suit/bio_suit
@@ -26,7 +26,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
strip_delay = 70
put_on_delay = 70
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index a25d4044482..77fd5976d4a 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -66,7 +66,7 @@
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake. "
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear)
- armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 50, acid = 100)
+ armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 100, acid = 100)
hooded = 1
hoodtype = /obj/item/clothing/head/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -78,7 +78,7 @@
name = "drake helm"
icon_state = "dragon"
desc = "The skull of a dragon."
- armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 50, acid = 100)
+ armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 100, acid = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index ad821773ac7..ec4b145f18b 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -100,7 +100,7 @@
item_state = "hazard"
blood_overlay_type = "armor"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,/obj/item/device/radio)
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
//Lawyer
/obj/item/clothing/suit/toggle/lawyer
name = "blue suit jacket"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index f19764bed15..61d1f7d4ebe 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -16,7 +16,7 @@
blood_overlay_type = "armor"
body_parts_covered = CHEST
allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/redtag
name = "red laser tag armor"
@@ -26,7 +26,7 @@
blood_overlay_type = "armor"
body_parts_covered = CHEST
allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/*
* Costume
@@ -89,7 +89,7 @@
w_class = 3
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/hastur
name = "\improper Hastur's robe"
@@ -342,7 +342,7 @@
desc = "Pompadour not included."
icon_state = "leatherjacket"
item_state = "hostrench"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective,/obj/item/device/radio)
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index bbca34cbf4f..f9cde71de41 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -57,7 +57,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
flags = THICKMATERIAL
- armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 25, acid = 50)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 80, acid = 50)
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -66,7 +66,7 @@
strip_delay = 70
put_on_delay = 70
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/bomb_suit
@@ -80,7 +80,7 @@
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 25, acid = 50)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 80, acid = 50)
flags_inv = HIDEJUMPSUIT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
@@ -88,7 +88,7 @@
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
strip_delay = 70
put_on_delay = 70
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/bomb_hood/security
@@ -114,7 +114,7 @@
strip_delay = 60
put_on_delay = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/radiation
name = "radiation suit"
@@ -132,4 +132,4 @@
strip_delay = 60
put_on_delay = 60
flags_inv = HIDEJUMPSUIT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index d2cd1a16b96..702e367634c 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -35,7 +35,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = /datum/dog_fashion/head/blue_wizard
/obj/item/clothing/head/wizard/marisa
@@ -124,7 +124,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/head/wizard/marisa/fake
name = "witch hat"
@@ -133,7 +133,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "witch robe"
@@ -143,7 +143,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/suit/wizrobe/paper
name = "papier-mch robe"
@@ -162,7 +162,7 @@
set category = "Object"
set name = "Summon Stick Minions"
set src in usr
- if(!istype(usr, /mob/living))
+ if(!isliving(usr))
return
if(!robe_charge)
usr << "\The robe's internal magic supply is still recharging!"
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 7ac3b606184..68b1fc784f2 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -14,7 +14,7 @@
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 3ac2b59656d..8a2e1a2ed2f 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -5,8 +5,8 @@
icon_state = "chiefengineer"
item_state = "gy_suit"
item_color = "chief"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 40, acid = 40)
- resistance_flags = FIRE_PROOF
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 80, acid = 40)
+ resistance_flags = 0
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -14,7 +14,7 @@
icon_state = "atmos"
item_state = "atmos_suit"
item_color = "atmos"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
@@ -22,11 +22,13 @@
icon_state = "engine"
item_state = "engi_suit"
item_color = "engine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 30, acid = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 60, acid = 20)
+ resistance_flags = 0
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
name = "roboticist's jumpsuit"
icon_state = "robotics"
item_state = "robotics"
- item_color = "robotics"
\ No newline at end of file
+ item_color = "robotics"
+ resistance_flags = 0
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index f88d34d1ba7..736e3ce3da8 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -37,7 +37,7 @@
item_state = "armor"
can_adjust = 0
strip_delay = 100
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/waiter
name = "waiter's outfit"
@@ -125,7 +125,7 @@
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = 0
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
@@ -378,7 +378,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
can_adjust = 0
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/sundress
name = "sundress"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 4ae10c98d94..ec506accf51 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -37,4 +37,4 @@
item_color = "trackpants"
can_adjust = 0
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = 0
\ No newline at end of file
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 503e6c657b0..4ea6592329f 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -48,7 +48,11 @@
U.cut_overlays()
U.hastie = null
+/obj/item/clothing/tie/proc/on_uniform_equip(obj/item/clothing/under/U)
+ return
+/obj/item/clothing/tie/proc/on_uniform_dropped(obj/item/clothing/under/U)
+ return
/obj/item/clothing/tie/blue
name = "blue tie"
@@ -367,3 +371,36 @@
icon_state = "talisman"
item_color = "talisman"
armor = list(melee = 5, bullet = 5, laser = 5, energy = 5, bomb = 20, bio = 20, rad = 5, fire = 0, acid = 25)
+
+//////////////
+//OBJECTION!//
+//////////////
+
+/obj/item/clothing/tie/lawyers_badge
+ name = "attorney's badge"
+ desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet."
+ icon_state = "lawyerbadge"
+ item_color = "lawyerbadge"
+
+/obj/item/clothing/tie/lawyers_badge/attach(obj/item/clothing/under/U, user)
+ if(!..())
+ return 0
+ if(isliving(U.loc))
+ on_uniform_equip(U)
+
+/obj/item/clothing/tie/lawyers_badge/detach(obj/item/clothing/under/U, user)
+ ..()
+ if(isliving(U.loc))
+ on_uniform_dropped(U)
+
+/obj/item/clothing/tie/lawyers_badge/on_uniform_equip(obj/item/clothing/under/U)
+ if(!isliving(U.loc))
+ return
+ var/mob/living/L = U.loc
+ L.bubble_icon = "lawyer"
+
+/obj/item/clothing/tie/lawyers_badge/on_uniform_dropped(obj/item/clothing/under/U)
+ if(!isliving(U.loc))
+ return
+ var/mob/living/L = U.loc
+ L.bubble_icon = initial(L.bubble_icon)
diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm
index 9b108de8e31..6f7a73355fa 100644
--- a/code/modules/countdown/countdown.dm
+++ b/code/modules/countdown/countdown.dm
@@ -115,7 +115,7 @@
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = attached_to
if(!istype(G))
return
- else if(G.health && !G.purpose_fulfilled)
+ else if(G.obj_integrity && !G.purpose_fulfilled)
return "[G.get_arrival_text(FALSE)] "
/obj/effect/countdown/transformer
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 1e1ed209bf0..7def4aa1922 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -62,7 +62,7 @@
. = list()
for(var/obj/item/I in user.held_items)
. += I
- if(!istype(user.loc, /turf))
+ if(!isturf(user.loc))
return
var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST))
for(var/A in L)
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index 276e88d82a9..7f0f711da25 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -28,7 +28,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "sc_Ace of Hearts_syndicate" // shut up
var/message = "A generic message of love or whatever."
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
w_class = 1
/obj/item/weapon/valentine/New()
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index c6f6ed5c910..5821f00588c 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -47,7 +47,7 @@
var/cracked = 0
/obj/item/weapon/toy/xmas_cracker/attack(mob/target, mob/user)
- if( !cracked && istype(target,/mob/living/carbon/human) && (target.stat == CONSCIOUS) && !target.get_active_held_item() )
+ if( !cracked && ishuman(target) && (target.stat == CONSCIOUS) && !target.get_active_held_item() )
target.visible_message("[user] and [target] pop \an [src]! *pop*", "You pull \an [src] with [target]! *pop*", "You hear a pop.")
var/obj/item/weapon/paper/Joke = new /obj/item/weapon/paper(user.loc)
Joke.name = "[pick("awful","terrible","unfunny")] joke"
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 5495c652189..b49ed5a4c6f 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -76,12 +76,12 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
x = clong.x
y = clong.y
- if (istype(clong, /turf) || istype(clong, /obj))
+ if(isturf(clong) || isobj(clong))
if(clong.density)
clong.ex_act(2)
- else if (istype(clong, /mob))
- if(istype(clong, /mob/living/carbon/human))
+ else if(ismob(clong))
+ if(ishuman(clong))
var/mob/living/carbon/human/H = clong
H.visible_message("[H.name] is penetrated by an immovable rod!" , "The rod penetrates you!" , "You hear a CLANG!")
H.adjustBruteLoss(160)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index de3632195d5..8a151a116e6 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -19,7 +19,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/T = pick(turfs)
- new/obj/structure/spacevine_controller(T) //spawn a controller at turf
+ new/obj/effect/spacevine_controller(T) //spawn a controller at turf
/datum/spacevine_mutation
@@ -328,8 +328,8 @@
/datum/spacevine_mutation/woodening/on_grow(obj/structure/spacevine/holder)
if(holder.energy)
holder.density = 1
- holder.maxhealth = 100
- holder.health = holder.maxhealth
+ holder.max_integrity = 100
+ holder.obj_integrity = holder.max_integrity
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
if(I.is_sharp())
@@ -362,10 +362,10 @@
layer = SPACEVINE_LAYER
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
- var/health = 50
- var/maxhealth = 50
+ obj_integrity = 50
+ max_integrity = 50
var/energy = 0
- var/obj/structure/spacevine_controller/master = null
+ var/obj/effect/spacevine_controller/master = null
var/list/mutations = list()
/obj/structure/spacevine/examine(mob/user)
@@ -415,39 +415,36 @@
qdel(src)
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
- if (!W || !user || !W.type)
- return
- user.changeNext_move(CLICK_CD_MELEE)
- var/force = W.force
if(istype(W, /obj/item/weapon/scythe))
- force = force * 4
+ user.changeNext_move(CLICK_CD_MELEE)
for(var/obj/structure/spacevine/B in orange(1,src))
- B.health = health - force
- if(B.health < 1)
- qdel(B)
-
- health = health - force
-
- if(health < 1)
- qdel(src)
-
+ B.take_damage(W.force * 4, BRUTE, "melee", 1)
return
+ else
+ return ..()
- if(W.is_sharp())
- force = force * 4
- if(W && W.damtype == "fire")
- force = force * 4
+/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
+ var/damage_dealt = I.force
+ if(I.is_sharp())
+ damage_dealt *= 4
+ if(I.damtype == BURN)
+ damage_dealt *= 4
for(var/datum/spacevine_mutation/SM in mutations)
- force = SM.on_hit(src, user, W, force) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
+ damage_dealt = SM.on_hit(src, user, I, force) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
+ take_damage(damage_dealt, I.damtype, "melee", 1)
- health = health - force
- if(health < 1)
- qdel(src)
-
- ..()
+/obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/weapons/slash.ogg', 50, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/structure/spacevine/Crossed(mob/crosser)
if(isliving(crosser))
@@ -469,7 +466,7 @@
/obj/structure/spacevine/attack_alien(mob/living/user)
eat(user)
-/obj/structure/spacevine_controller
+/obj/effect/spacevine_controller
invisibility = INVISIBILITY_ABSTRACT
var/list/obj/structure/spacevine/vines = list()
var/list/growth_queue = list()
@@ -478,7 +475,7 @@
var/list/mutations_list = list()
var/mutativness = 1
-/obj/structure/spacevine_controller/New(loc, list/muts, mttv, spreading)
+/obj/effect/spacevine_controller/New(loc, list/muts, mttv, spreading)
spawn_spacevine_piece(loc, , muts)
START_PROCESSING(SSobj, src)
init_subtypes(/datum/spacevine_mutation/, mutations_list)
@@ -488,20 +485,20 @@
spread_cap *= spreading / 50
spread_multiplier /= spreading / 50
-/obj/structure/spacevine_controller/ex_act() //only killing all vines will end this suffering
+/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering
return
-/obj/structure/spacevine_controller/singularity_act()
+/obj/effect/spacevine_controller/singularity_act()
return
-/obj/structure/spacevine_controller/singularity_pull()
+/obj/effect/spacevine_controller/singularity_pull()
return
-/obj/structure/spacevine_controller/Destroy()
+/obj/effect/spacevine_controller/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
+/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
var/obj/structure/spacevine/SV = new(location)
growth_queue += SV
vines += SV
@@ -520,7 +517,7 @@
for(var/datum/spacevine_mutation/SM in SV.mutations)
SM.on_birth(SV)
-/obj/structure/spacevine_controller/process()
+/obj/effect/spacevine_controller/process()
if(!vines)
qdel(src) //space vines exterminated. Remove the controller
return
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index f323f55cb50..dcbdba4db9c 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -10,7 +10,7 @@
var/interval = 2
var/list/vents = list()
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube",
- "plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","facid")
+ "plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid")
/datum/round_event/vent_clog/announce()
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index 5d0bc33b168..cb0add4374d 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -38,7 +38,7 @@
ruins_wizard_loadout = 1
for(var/mob/living/carbon/human/H in living_mob_list)
- if(ruins_spaceworthiness && (H.z != 1 || istype(H.loc, /turf/open/space) || isplasmaman(H)))
+ if(ruins_spaceworthiness && (H.z != 1 || isspaceturf(H.loc) || isplasmaman(H)))
continue //#savetheminers
if(ruins_wizard_loadout && H.mind && ((H.mind in ticker.mode.wizards) || (H.mind in ticker.mode.apprentices)))
continue
diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm
index d99793778d3..b5a2be80b02 100644
--- a/code/modules/events/wizard/petsplosion.dm
+++ b/code/modules/events/wizard/petsplosion.dm
@@ -13,5 +13,5 @@
if(activeFor >= 30 * countdown) // 0 seconds : 2 animals | 30 seconds : 4 animals | 1 minute : 8 animals
countdown += 1
for(var/mob/living/simple_animal/F in living_mob_list) //If you cull the heard before the next replication, things will be easier for you
- if(!istype(F, /mob/living/simple_animal/hostile))
+ if(!ishostile(F))
new F.type(F.loc)
\ No newline at end of file
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index 961671763ec..cacf2ba4fce 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -51,6 +51,7 @@
user << "[target] catches fire!"
if(target.resistance_flags & (LAVA_PROOF|FIRE_PROOF))
target.resistance_flags &= ~(LAVA_PROOF|FIRE_PROOF)
+ target.resistance_flags |= FLAMMABLE
target.fire_act()
qdel(src)
return
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 7e34d6a1b3a..c1cd8ab0e6b 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -363,7 +363,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/collapse
var/image/down
- var/health = 100
+ obj_integrity = 100
/obj/effect/fake_attacker/attackby(obj/item/weapon/P, mob/living/user, params)
step_away(src,my_target,2)
@@ -373,7 +373,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
my_target.visible_message("[my_target] flails around wildly.", \
"[my_target] has attacked [src]!")
- src.health -= P.force
+ obj_integrity -= P.force
/obj/effect/fake_attacker/Crossed(mob/M, somenumber)
if(M == my_target)
@@ -410,7 +410,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/fake_attacker/proc/attack_loop()
while(1)
sleep(rand(5,10))
- if(src.health < 0)
+ if(obj_integrity < 0)
collapse()
continue
if(get_dist(src,my_target) > 1)
@@ -622,7 +622,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
var/list/slots_free = list(l,r)
if(l_hand) slots_free -= l
if(r_hand) slots_free -= r
- if(istype(src,/mob/living/carbon/human))
+ if(ishuman(src))
var/mob/living/carbon/human/H = src
if(!H.belt) slots_free += ui_belt
if(!H.l_store) slots_free += ui_storage1
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 8e5024cbf82..a24b9974277 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -10,7 +10,7 @@
var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it.
possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/reagent_containers/food/drinks/New()
..()
@@ -74,7 +74,7 @@
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
user << "You transfer [trans] units of the solution to [target]."
- if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
+ if(iscyborg(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
var/mob/living/silicon/robot/bro = user
bro.cell.use(30)
addtimer(reagents, "add_reagent", 600, FALSE, refill, trans)
@@ -105,6 +105,7 @@
volume = 5
flags = CONDUCT | OPENCONTAINER
spillable = 1
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup
name = "gold cup"
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 41473bcfc9f..3bf95470b8b 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -7,21 +7,10 @@
amount_per_transfer_from_this = 10
volume = 50
materials = list(MAT_GLASS=500)
- resistance_flags = 0
- burntime = 5
+ obj_integrity = 20
+ max_integrity = 20
spillable = 1
-
-/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fire_act()
- if(!reagents.total_volume)
- return
- ..()
-
-/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/burn()
- reagents.total_volume = 0 //Burns away all the alcohol :(
- reagents.reagent_list.Cut()
- on_reagent_change()
- extinguish()
- return
+ resistance_flags = ACID_PROOF
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
cut_overlays()
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 9905d061150..4a05510ff07 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -4,7 +4,7 @@
/obj/item/weapon/reagent_containers/food
possible_transfer_amounts = list()
volume = 50 //Sets the default container amount for all food items.
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/reagent_containers/food/New()
..()
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index f16532a9bf9..406b998d7ed 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -176,12 +176,6 @@
list_reagents = list("nutriment" = 3, "toxin" = 5)
icon_state = "goliathmeat"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath/burn()
- visible_message("\The [src] finishes cooking!")
- new/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath/(src.loc)
- SSobj.burning -= src
- qdel(src)
-
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatwheat
name = "meatwheat clump"
desc = "This doesn't look like meat, but your standards aren't that high to begin with."
diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
index 6ce7a8b1790..54acb1aa49f 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
@@ -25,6 +25,12 @@
mixer = new /obj/item/weapon/reagent_containers(src, MIXER_CAPACITY)
mixer.name = "Mixer"
+/obj/machinery/food_cart/Destroy()
+ if(mixer)
+ qdel(mixer)
+ mixer = null
+ return ..()
+
/obj/machinery/food_cart/attack_hand(mob/user)
user.set_machine(src)
interact(user)
@@ -150,6 +156,11 @@
usr << browse(null,"window=foodcart")
return
+/obj/machinery/food_cart/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 4)
+ qdel(src)
+
#undef STORAGE_CAPACITY
#undef LIQUID_CAPACIY
#undef MIXER_CAPACITY
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index ea2fa786b16..56b4ec3f757 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -18,6 +18,8 @@
var/dispense_flavour = ICECREAM_VANILLA
var/flavour_name = "vanilla"
flags = OPENCONTAINER
+ obj_integrity = 300
+ max_integrity = 300
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -206,6 +208,12 @@
reagents.add_reagent("singulo", 2)
ice_creamed = 1
+/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 4)
+ qdel(src)
+
+
#undef ICECREAM_VANILLA
#undef ICECREAM_CHOCOLATE
#undef ICECREAM_STRAWBERRY
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 33e5d058f9c..f61e370eff0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -49,14 +49,6 @@
else
return ..()
-/obj/machinery/smartfridge/on_construction()
- for(var/datum/A in contents)
- qdel(A)
-
-/obj/machinery/smartfridge/on_deconstruction()
- for(var/atom/movable/A in contents)
- A.loc = loc
-
/obj/machinery/smartfridge/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
max_n_of_items = 1500 * B.rating
@@ -95,44 +87,44 @@
updateUsrDialog()
return
- if(stat)
- return 0
+ if(!stat)
- if(contents.len >= max_n_of_items)
- user << "\The [src] is full!"
- return 0
-
- if(accept_check(O))
- load(O)
- user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
- updateUsrDialog()
- return 1
-
- if(istype(O, /obj/item/weapon/storage/bag))
- var/obj/item/weapon/storage/P = O
- var/loaded = 0
- for(var/obj/G in P.contents)
- if(contents.len >= max_n_of_items)
- break
- if(accept_check(G))
- load(G)
- loaded++
- updateUsrDialog()
-
- if(loaded)
- if(contents.len >= max_n_of_items)
- user.visible_message("[user] loads \the [src] with \the [O].", \
- "You fill \the [src] with \the [O].")
- else
- user.visible_message("[user] loads \the [src] with \the [O].", \
- "You load \the [src] with \the [O].")
- if(O.contents.len > 0)
- user << "Some items are refused."
- else
- user << "There is nothing in [O] to put in [src]!"
+ if(contents.len >= max_n_of_items)
+ user << "\The [src] is full!"
return 0
- else if(user.a_intent != "harm")
+ if(accept_check(O))
+ load(O)
+ user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
+ updateUsrDialog()
+ return 1
+
+ if(istype(O, /obj/item/weapon/storage/bag))
+ var/obj/item/weapon/storage/P = O
+ var/loaded = 0
+ for(var/obj/G in P.contents)
+ if(contents.len >= max_n_of_items)
+ break
+ if(accept_check(G))
+ load(G)
+ loaded++
+ updateUsrDialog()
+
+ if(loaded)
+ if(contents.len >= max_n_of_items)
+ user.visible_message("[user] loads \the [src] with \the [O].", \
+ "You fill \the [src] with \the [O].")
+ else
+ user.visible_message("[user] loads \the [src] with \the [O].", \
+ "You load \the [src] with \the [O].")
+ if(O.contents.len > 0)
+ user << "Some items are refused."
+ return 1
+ else
+ user << "There is nothing in [O] to put in [src]!"
+ return 0
+
+ if(user.a_intent != "harm")
user << "\The [src] smartly refuses [O]."
updateUsrDialog()
return 0
@@ -294,6 +286,10 @@
return 1
return 0
+/obj/machinery/smartfridge/drying_rack/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/mineral/wood (loc, 10)
+ qdel(src)
+
/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff = 0)
if(drying || forceoff)
drying = 0
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index cf7e6ae024d..bb8d4e144eb 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -81,7 +81,7 @@
if(flag)
return //It's adjacent, is the user, or is on the user's person
- if (istype(A, /mob/living))
+ if(isliving(A))
src.dealTo(A, user)
else
return ..()
@@ -125,7 +125,7 @@
var/blank = 0
var/list/cards = list()
var/datum/html_interface/hi
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/hand/New(loc)
. = ..()
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index a75446b667e..fbe73113f1a 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -29,7 +29,7 @@
for(var/obj/effect/landmark/R in landmarks_list)
if(R.name != "blobspawn")
if(prob(35))
- if(istype(R.loc,/turf/open/space))
+ if(isspaceturf(R.loc))
new /mob/living/simple_animal/chicken/rabbit/space(R.loc)
else
new /mob/living/simple_animal/chicken/rabbit(R.loc)
diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm
index 3f31cddf91d..d2e4a1d05b2 100644
--- a/code/modules/holodeck/area_copy.dm
+++ b/code/modules/holodeck/area_copy.dm
@@ -21,7 +21,7 @@
O.vars[V] = original.vars[V]
if(istype(O))
- O.resistance_flags |= LAVA_PROOF | FIRE_PROOF | UNACIDABLE // holoitems do not burn
+ O.resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF // holoitems do not burn
if(nerf && istype(O,/obj/item))
var/obj/item/I = O
I.damtype = STAMINA // thou shalt not
@@ -76,7 +76,7 @@
continue
if(platingRequired)
- if(istype(B, /turf/open/space))
+ if(isspaceturf(B))
continue
var/old_dir1 = T.dir
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index c29ebfb5ea7..10349f42d3f 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -143,14 +143,14 @@
/obj/machinery/computer/holodeck/proc/floorcheck()
for(var/turf/T in linked)
- if(!T.intact || istype(T,/turf/open/space))
+ if(!T.intact || isspaceturf(T))
return 0
return 1
/obj/machinery/computer/holodeck/Topic(href, list/href_list)
if(..())
return
- if(!Adjacent(usr) && !istype(usr, /mob/living/silicon))
+ if(!Adjacent(usr) && !issilicon(usr))
return
usr.set_machine(src)
add_fingerprint(usr)
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 18e378d9e5a..7d7b5564c54 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -62,7 +62,7 @@
/obj/item/toy/beach_ball/holoball
name = "basketball"
- icon = 'icons/obj/basketball.dmi'
+ icon = 'icons/obj/items.dmi'
icon_state = "basketball"
item_state = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 4787f2829b0..d9945de3f94 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -66,7 +66,7 @@
return
if(default_deconstruction_crowbar(I))
return
- if(isrobot(user))
+ if(iscyborg(user))
return
if(istype(I, /obj/item/seeds))
@@ -104,7 +104,7 @@
return
var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600)
- if(!( in_range(src, user) || istype(user, /mob/living/silicon) ))
+ if(!(in_range(src, user) || issilicon(user)))
popup.close()
return
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 77f04b08ccc..d486dec83ab 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -14,7 +14,7 @@
dried_type = -1
// Saves us from having to define each stupid grown's dried_type as itself.
// If you don't want a plant to be driable (watermelons) set this to null in the time definition.
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
origin_tech = "biotech=1"
/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null)
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 824ceadd50b..784b9ee44ff 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -181,7 +181,7 @@
/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M, mob/user)
if(!..()) return
- if(istype(M, /mob/living))
+ if(isliving(M))
M << "You are lit on fire from the intense heat of the [name]!"
M.adjust_fire_stacks(seed.potency / 20)
if(M.IgniteMob())
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index 04b48caa83a..2e05b8bb35b 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -27,12 +27,12 @@
return (BRUTELOSS)
/obj/item/seeds/kudzu/proc/plant(mob/user)
- if(istype(user.loc,/turf/open/space))
+ if(isspaceturf(user.loc))
return
var/turf/T = get_turf(src)
message_admins("Kudzu planted by [key_name_admin(user)](?) (FLW) at ([T.x],[T.y],[T.z] - (JMP))",0,1)
investigate_log("was planted by [key_name(user)] at ([T.x],[T.y],[T.z])","kudzu")
- new /obj/structure/spacevine_controller(user.loc, mutations, potency, production)
+ new /obj/effect/spacevine_controller(user.loc, mutations, potency, production)
qdel(src)
/obj/item/seeds/kudzu/attack_self(mob/user)
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 4504d1740ba..508880f5c6e 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -115,6 +115,8 @@
seed = /obj/item/seeds/cherry/bomb
bitesize_mod = 2
volume = 125 //Gives enough room for the black powder at max potency
+ obj_integrity = 40
+ max_integrity = 40
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
var/area/A = get_area(user)
@@ -123,12 +125,14 @@
log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
prime()
-/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/burn()
- prime()
- ..()
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE)
+ if(!disassembled)
+ prime()
+ if(!qdeleted(src))
+ qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity)
- qdel(src) //Ensuring that it's deleted by its own explosion
+ qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
icon_state = "cherry_bomb_lit"
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 9dc0ab8f97c..0125c35fcbd 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -168,7 +168,7 @@
origin_tech = "biotech=4;programming=5"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user)
- if(istype(user.loc,/turf/open/space))
+ if(isspaceturf(user.loc))
return
var/mob/living/simple_animal/hostile/mushroom/M = new /mob/living/simple_animal/hostile/mushroom(user.loc)
M.maxHealth += round(seed.endurance / 4)
@@ -241,11 +241,12 @@
origin_tech = "biotech=4;plasmatech=6"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
- if(istype(user.loc,/turf/open/space))
+ if(isspaceturf(user.loc))
return
var/obj/structure/glowshroom/planted = new effect_path(user.loc)
planted.delay = planted.delay - seed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
- planted.endurance = seed.endurance
+ planted.obj_integrity = seed.endurance
+ planted.max_integrity = seed.endurance
planted.yield = seed.yield
planted.potency = seed.potency
user << "You plant [src]."
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index be78c4ef8b2..fa8f9fc1de7 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -56,7 +56,7 @@
var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm"
var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone)
if(affecting)
- if(affecting.take_damage(0, force))
+ if(affecting.receive_damage(0, force))
C.update_damage_overlays()
C << "The nettle burns your bare hand!"
return 1
@@ -98,7 +98,7 @@
/obj/item/weapon/grown/nettle/death/attack(mob/living/carbon/M, mob/user)
if(!..()) return
- if(istype(M, /mob/living))
+ if(isliving(M))
M << "You are stunned by the powerful acid of the Deathnettle!"
add_logs(user, M, "attacked", src)
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 2fc857d23c4..ed1ee69456e 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -58,7 +58,7 @@
if(config.revival_pod_plants)
if(ckey)
for(var/mob/M in player_list)
- if(istype(M, /mob/dead/observer))
+ if(isobserver(M))
var/mob/dead/observer/O = M
if(O.ckey == ckey && O.can_reenter_corpse)
make_podman = 1
@@ -66,19 +66,19 @@
else
if(M.ckey == ckey && M.stat == DEAD && !M.suiciding)
make_podman = 1
- if(istype(M, /mob/living))
+ if(isliving(M))
var/mob/living/L = M
make_podman = !L.hellbound
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in player_list)
if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding)
- if(istype(M, /mob/dead/observer))
+ if(isobserver(M))
var/mob/dead/observer/O = M
if(!O.can_reenter_corpse)
break
make_podman = 1
- if(istype(M, /mob/living))
+ if(isliving(M))
var/mob/living/L = M
make_podman = !L.hellbound
ckey_holder = M.ckey
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index f93cc1c6ad9..30a20975fd5 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -124,7 +124,7 @@
..()
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user)
- if(awakening || istype(user.loc,/turf/open/space))
+ if(awakening || isspaceturf(user.loc))
return
user << "You begin to awaken the Killer Tomato..."
awakening = 1
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 96b40353db3..8fa0c463c3b 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -134,7 +134,7 @@
/obj/structure/bonfire/proc/CheckOxygen()
- if(istype(loc,/turf/open))
+ if(isopenturf(loc))
var/turf/open/O = loc
if(O.air)
var/G = O.air.gases
@@ -150,7 +150,7 @@
Burn()
START_PROCESSING(SSobj, src)
-/obj/structure/bonfire/fire_act()
+/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume)
StartBurning()
/obj/structure/bonfire/Crossed(atom/movable/AM)
@@ -165,9 +165,7 @@
continue
if(isobj(A))
var/obj/O = A
- if(O.resistance_flags & FIRE_PROOF)
- continue
- O.fire_act()
+ O.fire_act(1000, 500)
else if(isliving(A))
var/mob/living/L = A
L.adjust_fire_stacks(fire_stack_strength)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 4fe9efe83c6..2c23081c95d 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -5,7 +5,7 @@
/obj/item/weapon/grown // Grown weapons
name = "grown_weapon"
icon = 'icons/obj/hydroponics/harvest.dmi'
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
/obj/item/weapon/grown/New(newloc, var/obj/item/seeds/new_seed = null)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 744b4126cb3..82134306813 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -16,7 +16,7 @@
var/toxic = 0 //Toxicity in the tray?
var/age = 0 //Current age
var/dead = 0 //Is it dead?
- var/health = 0 //Its health.
+ var/plant_health //Its health
var/lastproduce = 0 //Last time it was harvested
var/lastcycle = 0 //Used for timing of cycles.
var/cycledelay = 200 //About 10 seconds / cycle
@@ -197,8 +197,8 @@
//Health & Age///////////////////////////////////////////////////////////
- // Plant dies if health <= 0
- if(health <= 0)
+ // Plant dies if plant_health <= 0
+ if(plant_health <= 0)
plantdies()
adjustWeeds(1 / rating) // Weeds flourish
@@ -305,7 +305,7 @@
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowwater3"))
if(nutrilevel <= 2)
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lownutri3"))
- if(health <= (myseed.endurance / 2))
+ if(plant_health <= (myseed.endurance / 2))
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowhealth3"))
if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40)
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_alert3"))
@@ -321,7 +321,7 @@
user << "It's dead!"
else if (harvest)
user << "It's ready to harvest."
- else if (health <= (myseed.endurance / 2))
+ else if (plant_health <= (myseed.endurance / 2))
user << "It looks unhealthy."
else
user << "[src] is empty."
@@ -366,7 +366,7 @@
else
myseed = new /obj/item/seeds/weeds(src)
age = 0
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
harvest = 0
weedlevel = 0 // Reset
@@ -399,7 +399,7 @@
hardmutate()
age = 0
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
harvest = 0
weedlevel = 0 // Reset
@@ -419,7 +419,7 @@
dead = 0
hardmutate()
age = 0
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
harvest = 0
weedlevel = 0 // Reset
@@ -432,7 +432,7 @@
/obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier
- health = 0
+ plant_health = 0
harvest = 0
pestlevel = 0 // Pests die
if(!dead)
@@ -773,9 +773,9 @@
dead = 0
myseed = O
age = 1
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
- O.loc = src
+ O.forceMove(src)
update_icon()
else
user << "[src] already has seeds in it!"
@@ -858,7 +858,7 @@
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
if(myseed) //Could be that they're just using it as a de-weeder
age = 0
- health = 0
+ plant_health = 0
if(harvest)
harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it
qdel(myseed)
@@ -870,7 +870,7 @@
return ..()
/obj/machinery/hydroponics/attack_hand(mob/user)
- if(istype(user, /mob/living/silicon)) //How does AI know what plant is?
+ if(issilicon(user)) //How does AI know what plant is?
return
if(harvest)
myseed.harvest(user)
@@ -910,7 +910,7 @@
/obj/machinery/hydroponics/proc/adjustHealth(adjustamt)
if(myseed && !dead)
- health = Clamp(health + adjustamt, 0, myseed.endurance)
+ plant_health = Clamp(plant_health + adjustamt, 0, myseed.endurance)
/obj/machinery/hydroponics/proc/adjustToxic(adjustamt)
toxic = Clamp(toxic + adjustamt, 0, 100)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 3812bc18124..7431980ac1f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -276,7 +276,7 @@
if(isliving(target))
var/teleport_radius = max(round(G.seed.potency / 10), 1)
var/turf/T = get_turf(target)
- new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect...
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
do_teleport(target, T, teleport_radius)
/datum/plant_gene/trait/teleport/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
@@ -287,7 +287,7 @@
if(prob(50))
do_teleport(G, T, teleport_radius)
else
- new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect...
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
qdel(G)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 51bdb5b7fb8..b395b8e277d 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/hydroponics/seeds.dmi'
icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game.
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/plantname = "Plants" // Name of plant when planted.
var/product // A type path. The thing that is created when the plant is harvested.
var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overriden.
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 0b15123b142..0dfc814eae1 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -106,18 +106,18 @@
//check if it doesn't require any access at all
if(src.check_access(null))
return 1
- if(istype(M, /mob/living/silicon))
- //AI can do whatever he wants
+ if(issilicon(M))
+ //AI can do whatever it wants
return 1
if(IsAdminGhost(M))
//Access can't stop the abuse
return 1
- else if(istype(M, /mob/living/carbon/human))
+ else if(ishuman(M))
var/mob/living/carbon/human/H = M
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_held_item()) || src.check_access(H.wear_id))
return 1
- else if(istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/alien/humanoid))
+ else if(ismonkey(M) || isalienadult(M))
var/mob/living/carbon/george = M
//they can only hold things :(
if(check_access(george.get_active_held_item()))
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 6264c73d6ed..ef2eebf4d14 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -165,6 +165,8 @@ Lawyer
shoes = /obj/item/clothing/shoes/laceup
l_hand = /obj/item/weapon/storage/briefcase/lawyer
l_pocket = /obj/item/device/laser_pointer
+ r_pocket = /obj/item/clothing/tie/lawyers_badge
+
/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -177,5 +179,3 @@ Lawyer
if(J.lawyers>1)
uniform = /obj/item/clothing/under/lawyer/purpsuit
suit = /obj/item/clothing/suit/toggle/lawyer/purple
-
- H.bubble_icon = "lawyer"
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index abdd72df540..c707fb544bb 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -17,8 +17,10 @@
anchored = 0
density = 1
opacity = 0
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
var/state = 0
var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/book) //Things allowed in the bookcase
@@ -46,8 +48,7 @@
playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
if(do_after(user, 20/I.toolspeed, target = src))
user << "You pry the frame apart."
- new /obj/item/stack/sheet/mineral/wood(loc, 4)
- qdel(src)
+ deconstruct(TRUE)
if(1)
if(istype(I, /obj/item/stack/sheet/mineral/wood))
@@ -109,13 +110,12 @@
update_icon()
-/obj/structure/bookcase/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- for(var/obj/item/weapon/book/b in contents)
- b.loc = (get_turf(src))
- if(prob(50))
- qdel(src)
+/obj/structure/bookcase/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/mineral/wood(loc, 4)
+ for(var/obj/item/weapon/book/B in contents)
+ B.forceMove(get_turf(src))
+ qdel(src)
+
/obj/structure/bookcase/update_icon()
if(contents.len < 5)
@@ -167,7 +167,7 @@
throw_range = 5
w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/dat //Actual page content
var/due_date = 0 //Game time in 1/10th seconds
var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 9109ddefc76..c31226730ea 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -179,9 +179,6 @@
else
return ..()
-/obj/structure/closet/crate/secure/loot/attack_animal(mob/user)
- boom(user)
-
/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
if(!user.canUseTopic(src))
return
@@ -224,8 +221,7 @@
else
..()
-/obj/structure/closet/crate/secure/loot/burn()
- SSobj.burning -= src
+/obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE)
boom()
/obj/structure/closet/crate/secure/loot/proc/boom(mob/user)
diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm
index 7e139965aa2..c60ebd6c536 100644
--- a/code/modules/mining/equipment.dm
+++ b/code/modules/mining/equipment.dm
@@ -242,7 +242,7 @@
/obj/effect/resonance/proc/burst(turf/T)
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
- if(istype(T, /turf/closed/mineral))
+ if(ismineralturf(T))
var/turf/closed/mineral/M = T
M.gets_drilled(creator)
for(var/mob/living/L in T)
@@ -285,7 +285,7 @@
/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
if(!loaded)
return
- if(istype(target, /mob/living) && proximity_flag)
+ if(isliving(target) && proximity_flag)
if(istype(target, /mob/living/simple_animal))
var/mob/living/simple_animal/M = target
if(M.sentience_type != revive_type)
@@ -294,7 +294,7 @@
if(M.stat == DEAD)
M.faction = list("neutral")
M.revive(full_heal = 1, admin_revive = 1)
- if(istype(target, /mob/living/simple_animal/hostile))
+ if(ishostile(target))
var/mob/living/simple_animal/hostile/H = M
if(malfunctioning)
H.faction |= list("lazarus", "\ref[user]")
@@ -522,7 +522,7 @@
L.underlays += I
hammer_synced.marked_image = I
var/target_turf = get_turf(target)
- if(istype(target_turf, /turf/closed/mineral))
+ if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, M)
M.gets_drilled(firer)
@@ -531,7 +531,7 @@
/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
+ if(!isturf(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm
index fe7cf2e6818..81a1c070d5a 100644
--- a/code/modules/mining/fulton.dm
+++ b/code/modules/mining/fulton.dm
@@ -71,7 +71,7 @@ var/list/total_extraction_beacons = list()
var/image/balloon
var/image/balloon2
var/image/balloon3
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/M = A
M.Weaken(16) // Keep them from moving during the duration of the extraction
M.buckled = 0 // Unbuckle them to prevent anchoring problems
@@ -104,7 +104,7 @@ var/list/total_extraction_beacons = list()
sleep(10)
playsound(holder_obj.loc, 'sound/items/fultext_launch.wav', 50, 1, -3)
animate(holder_obj, pixel_z = 1000, time = 30)
- if(istype(A, /mob/living/carbon/human))
+ if(ishuman(A))
var/mob/living/carbon/human/L = A
L.SetParalysis(0)
L.drowsyness = 0
@@ -173,12 +173,12 @@ var/list/total_extraction_beacons = list()
var/atom/movable/stored_obj
/obj/item/weapon/extraction_pack/proc/check_for_living_mobs(atom/A)
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/L = A
if(L.stat != DEAD)
return 1
for(var/thing in A.GetAllContents())
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/L = A
if(L.stat != DEAD)
return 1
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index 0c27cc1b878..d078f6f5c6b 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -154,8 +154,9 @@
icon_state = "mushroom_shavings"
list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2)
w_class = 1
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
var/prepared = FALSE
var/prepared_type = /obj/item/weapon/reagent_containers/food/snacks/ash_flora/shavings
var/standard_prep = TRUE
@@ -245,6 +246,17 @@
icon_state = "cactus_fruit_p"
//prepared = TRUE
+
+/obj/item/mushroom_bowl
+ name = "mushroom bowl"
+ desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
+ icon = 'icons/obj/lavaland/ash_flora.dmi'
+ icon_state = "mushroom_bowl"
+ w_class = 2
+ resistance_flags = FLAMMABLE
+ obj_integrity = 200
+ max_integrity = 200
+
//what you can craft with these things
/datum/crafting_recipe/mushroom_bowl
name = "Mushroom Bowl"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e97a66b7070..62ba898d767 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -83,24 +83,21 @@
user << "The wisp has gone missing!"
return
if(wisp.loc == src)
- user << "You release the wisp. It begins to \
- bob around your head."
+ user << "You release the wisp. It begins to bob around your head."
user.sight |= SEE_MOBS
icon_state = "lantern"
wisp.orbit(user, 20)
feedback_add_details("wisp_lantern","F") // freed
else
- user << "You return the wisp to the lantern.\
- "
+ user << "You return the wisp to the lantern."
if(wisp.orbiting)
var/atom/A = wisp.orbiting.orbiting
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/M = A
M.sight &= ~SEE_MOBS
- M << "Your vision returns to \
- normal."
+ M << "Your vision returns to normal."
wisp.stop_orbit()
wisp.loc = src
@@ -116,8 +113,7 @@
if(wisp.loc == src)
qdel(wisp)
else
- wisp.visible_message("[wisp] has a sad \
- feeling for a moment, then it passes.")
+ wisp.visible_message("[wisp] has a sad feeling for a moment, then it passes.")
..()
//Wisp Lantern
@@ -233,7 +229,7 @@
if(cooldown < world.time)
feedback_add_details("immortality_talisman","U") // usage
cooldown = world.time + 600
- user.visible_message("[user] vanishes from reality, leaving a a hole in their place!")
+ user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!")
var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc))
Z.name = "hole in reality"
Z.desc = "It's shaped an awful lot like [user.name]."
@@ -252,7 +248,6 @@
/obj/effect/immortality_talisman
icon_state = "blank"
icon = 'icons/effects/effects.dmi'
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/can_destroy = FALSE
/obj/effect/immortality_talisman/attackby()
@@ -514,7 +509,7 @@
return
user << "You call out for aid, attempting to summon spirits to your side."
- notify_ghosts("[user] is raising their [src], calling for your help!",
+ notify_ghosts("[user] is raising [user.p_their()] [src], calling for your help!",
enter_link="(Click to help)",
source = user, action=NOTIFY_ORBIT)
@@ -756,7 +751,7 @@
for(var/mob/living/carbon/human/H in player_list)
if(H == L)
continue
- H << "You have an overwhelming desire to kill [L]. They have been marked red! Go kill them!"
+ H << "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!"
H.put_in_hands_or_del(new /obj/item/weapon/kitchen/knife/butcher(H))
qdel(src)
@@ -794,7 +789,7 @@
addtimer(src, "aoe_burst", 0, FALSE, T, user)
add_logs(user, target, "fired 3x3 blast at", src)
else
- if(istype(target, /turf/closed/mineral) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it)
+ if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it)
addtimer(src, "cardinal_blasts", 0, FALSE, T, user)
timer = world.time + cooldown_time
else if(target in view(5, get_turf(user))) //if the target is in view, hit it
@@ -814,9 +809,12 @@
friendly_fire_check = !friendly_fire_check
user << "You toggle friendly fire [friendly_fire_check ? "off":"on"]!"
return
+ if(!user.is_holding(src)) //you need to hold the staff to teleport
+ user << "You need to hold the staff in your hands to [rune ? "teleport with it":"create a rune"]!"
+ return
if(!rune)
if(isturf(user.loc))
- user.visible_message("[user] holds [src] carefully in front of them, moving it in a strange pattern...", \
+ user.visible_message("[user] holds [src] carefully in front of [user.p_them()], moving it in a strange pattern...", \
"You start creating a hierophant rune to teleport to...")
timer = world.time + 51
if(do_after(user, 50, target = user))
@@ -826,7 +824,7 @@
var/obj/effect/hierophant/H = new/obj/effect/hierophant(T)
rune = H
user.update_action_buttons_icon()
- user.visible_message("[user] creates a strange rune beneath them!", \
+ user.visible_message("[user] creates a strange rune beneath [user.p_them()]!", \
"You create a hierophant rune, which you can teleport yourself and any allies to at any time!\n\
You can remove the rune to place a new one by striking it with the staff.")
else
@@ -834,9 +832,6 @@
else
user << "You need to be on solid ground to produce a rune!"
return
- if(!user.is_holding(src)) //you need to hold the staff to teleport
- user << "You need to hold the staff in your hands to [rune ? "teleport with it":"create a rune"]!"
- return
if(get_dist(user, rune) <= 2) //rune too close abort
user << "You are too close to the rune to teleport to it!"
return
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 25bc17f142c..fcfd1f05717 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -452,9 +452,10 @@
var/buildstackamount = 5
/obj/structure/fans/deconstruct()
- if(buildstacktype)
- new buildstacktype(loc,buildstackamount)
- ..()
+ if(!(flags & NODECONSTRUCT))
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
+ qdel(src)
/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index a2ffd309444..07d85335fbd 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -36,6 +36,10 @@
if(istype(T, /turf/closed/mineral/random))
Spread(T)
+
+/turf/closed/mineral/acid_melt()
+ ChangeTurf(baseturf)
+
/turf/closed/mineral/volcanic
environment_type = "basalt"
turf_type = /turf/open/floor/plating/asteroid/basalt
@@ -73,7 +77,7 @@
var/path = pickweight(mineralSpawnChanceList)
var/turf/T = ChangeTurf(path)
- if(T && istype(T, /turf/closed/mineral))
+ if(T && ismineralturf(T))
var/turf/closed/mineral/M = T
M.mineralAmt = rand(1, 5)
M.environment_type = src.environment_type
@@ -359,7 +363,7 @@
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnFloor(turf/T)
for(var/S in RANGE_TURFS(1, src))
var/turf/NT = S
- if(!NT || istype(NT, /turf/open/space) || istype(NT.loc, /area/mine/explored) || istype(NT.loc, /area/lavaland/surface/outdoors/explored))
+ if(!NT || isspaceturf(NT) || istype(NT.loc, /area/mine/explored) || istype(NT.loc, /area/lavaland/surface/outdoors/explored))
sanity = 0
break
if(!sanity)
@@ -402,7 +406,7 @@
if (istype(P, /obj/item/weapon/pickaxe))
var/turf/T = user.loc
- if (!( istype(T, /turf) ))
+ if (!isturf(T))
return
if(last_act+P.digspeed > world.time)//prevents message spam
@@ -412,7 +416,7 @@
P.playDigSound()
if(do_after(user,P.digspeed, target = src))
- if(istype(src, /turf/closed/mineral))
+ if(ismineralturf(src))
user << "You finish cutting into the rock."
gets_drilled(user)
feedback_add_details("pick_used_mining","[P.type]")
@@ -446,13 +450,13 @@
/turf/closed/mineral/Bumped(AM as mob|obj)
..()
- if(istype(AM,/mob/living/carbon/human))
+ if(ishuman(AM))
var/mob/living/carbon/human/H = AM
var/obj/item/I = H.is_holding_item_of_type(/obj/item/weapon/pickaxe)
if(I)
attackby(I,H)
return
- else if(istype(AM,/mob/living/silicon/robot))
+ else if(iscyborg(AM))
var/mob/living/silicon/robot/R = AM
if(istype(R.module_active,/obj/item/weapon/pickaxe))
src.attackby(R.module_active,R)
@@ -561,7 +565,7 @@
digging_speed = P.digspeed
if (digging_speed)
var/turf/T = user.loc
- if (!( istype(T, /turf) ))
+ if(!isturf(T))
return
if (dug)
@@ -725,11 +729,20 @@
L.resting = TRUE
animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10)
for(var/i in 1 to 5)
+ //Make sure the item is still there after our sleep
+ if(!AM || qdeleted(AM))
+ return
AM.pixel_y--
sleep(2)
- if(isrobot(AM))
+
+ //Make sure the item is still there after our sleep
+ if(!AM || qdeleted(AM))
+ return
+
+ if(iscyborg(AM))
var/mob/living/silicon/robot/S = AM
qdel(S.mmi)
+
qdel(AM)
/turf/closed/mineral/volcanic/lava_land_surface
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index bb92d145e93..234f3adfcaa 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -24,6 +24,7 @@
maxHealth = 125
melee_damage_lower = 15
melee_damage_upper = 15
+ obj_damage = 0
environment_smash = 0
check_friendly_fire = 1
stop_automated_movement_when_pulled = 1
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index d98a98b714c..f68565e29ce 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -5,8 +5,9 @@
icon_state = "moneybag"
force = 10
throwforce = 0
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
w_class = 4
max_w_class = 3
storage_slots = 80
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 3f36349ff7f..932def45a6a 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -345,7 +345,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set category = "Ghost"
set name = "Teleport"
set desc= "Teleport to a location"
- if(!istype(usr, /mob/dead/observer))
+ if(!isobserver(usr))
usr << "Not when you're not dead!"
return
var/A
@@ -417,7 +417,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Jump to Mob"
set desc = "Teleport to a mob"
- if(istype(usr, /mob/dead/observer)) //Make sure they're an observer!
+ if(isobserver(usr)) //Make sure they're an observer!
var/list/dest = list() //List of possible destinations (mobs)
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index b6ea4447421..a190b47b448 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -12,7 +12,7 @@
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
- if(istype(V.source, /mob/living/silicon/ai))
+ if(isAI(V.source))
var/mob/living/silicon/ai/S = V.source
speaker = S.eyeobj
else
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index 7be2862b0fc..6061964f5b0 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -1216,27 +1216,25 @@
if(shouldTryHeal == 1)
for(var/mob/living/carbon/human/C in nearby)
- if(istype(C,/mob/living/carbon/human)) //I haven't the foggiest clue why this is turning up non-carbons but sure here whatever
- if(C.health <= 75)
- if(get_dist(src,C) <= 2)
- src.say("Wait, [C], let me heal you!")
- M.attack(C,src)
- sleep(25)
- else
- tryWalk(get_turf(C))
+ if(C.health <= 75)
+ if(get_dist(src,C) <= 2)
+ src.say("Wait, [C], let me heal you!")
+ M.attack(C,src)
+ sleep(25)
+ else
+ tryWalk(get_turf(C))
else if(shouldTryHeal == 2)
if(HPS)
if(HPS.reagents.total_volume <= 0)
HPS.reagents.add_reagent("tricordrazine",30)
for(var/mob/living/carbon/human/C in nearby)
- if(istype(C,/mob/living/carbon/human))
- if(C.health <= 75 && C.reagents.get_reagent_amount("tricordrazine") <= 0) // make sure they wont be overdosing
- if(get_dist(src,C) <= 2)
- src.say("Wait, [C], let me heal you!")
- HPS.attack(C,src)
- sleep(25)
- else
- tryWalk(get_turf(C))
+ if(C.health <= 75 && C.reagents.get_reagent_amount("tricordrazine") <= 0) // make sure they wont be overdosing
+ if(get_dist(src,C) <= 2)
+ src.say("Wait, [C], let me heal you!")
+ HPS.attack(C,src)
+ sleep(25)
+ else
+ tryWalk(get_turf(C))
/mob/living/carbon/human/interactive/proc/dojanitor(obj)
@@ -1514,7 +1512,7 @@
if((TARGET && (doing & FIGHTING))) // this is a redundancy check
var/mob/living/M = TARGET
- if(istype(M,/mob/living))
+ if(isliving(M))
if(M.health > 1)
//THROWING OBJECTS
for(var/A in allContents)
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 542616a278e..89f1a5a7529 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -315,6 +315,7 @@
return items
+
/obj/item/proc/equip_to_best_slot(var/mob/M)
if(src != M.get_active_held_item())
M << "You are not holding anything to equip!"
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 9f9b9fb5e30..a1ada1800a3 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -6,7 +6,7 @@
density = 0
anchored = 1
invisibility = 60
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/slaughter/relaymove(mob/user, direction)
forceMove(get_step(src,direction))
@@ -68,7 +68,7 @@
return
// if the thing we're pulling isn't alive
- if (!(istype(pullee, /mob/living)))
+ if (!isliving(pullee))
return
var/mob/living/victim = pullee
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 4979cbd6c7d..9d8ea058792 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -90,23 +90,27 @@
user << "You toggle the MMI's radio system [radio.on==1 ? "on" : "off"]."
else
user << "You unlock and upend the MMI, spilling the brain onto the floor."
-
- brainmob.container = null //Reset brainmob mmi var.
- brainmob.loc = brain //Throw mob into brain.
- brainmob.stat = DEAD
- brainmob.emp_damage = 0
- brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision
- living_mob_list -= brainmob //Get outta here
- dead_mob_list += brainmob
- brain.brainmob = brainmob //Set the brain to use the brainmob
- brainmob = null //Set mmi brainmob var to null
-
- user.put_in_hands(brain) //puts brain in the user's hand or otherwise drops it on the user's turf
- brain = null //No more brain in here
-
+ eject_brain(user)
update_icon()
name = "Man-Machine Interface"
+/obj/item/device/mmi/proc/eject_brain(mob/user)
+ brainmob.container = null //Reset brainmob mmi var.
+ brainmob.loc = brain //Throw mob into brain.
+ brainmob.stat = DEAD
+ brainmob.emp_damage = 0
+ brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision
+ living_mob_list -= brainmob //Get outta here
+ dead_mob_list += brainmob
+ brain.brainmob = brainmob //Set the brain to use the brainmob
+ brainmob = null //Set mmi brainmob var to null
+ if(user)
+ user.put_in_hands(brain) //puts brain in the user's hand or otherwise drops it on the user's turf
+ else
+ brain.forceMove(get_turf(src))
+ brain = null //No more brain in here
+
+
/obj/item/device/mmi/proc/transfer_identity(mob/living/L) //Same deal as the regular brain proc. Used for human-->robot people.
if(!brainmob)
brainmob = new(src)
@@ -164,14 +168,27 @@
..()
/obj/item/device/mmi/Destroy()
- if(isrobot(loc))
+ if(iscyborg(loc))
var/mob/living/silicon/robot/borg = loc
borg.mmi = null
if(brainmob)
qdel(brainmob)
brainmob = null
+ if(brain)
+ qdel(brain)
+ brain = null
+ if(mecha)
+ mecha = null
+ if(radio)
+ qdel(radio)
+ radio = null
return ..()
+/obj/item/device/mmi/deconstruct(disassembled = TRUE)
+ if(brain)
+ eject_brain()
+ qdel(src)
+
/obj/item/device/mmi/examine(mob/user)
..()
if(brainmob)
diff --git a/code/modules/mob/living/brain/emote.dm b/code/modules/mob/living/brain/emote.dm
index 8ab505f7a9e..a225c3ad819 100644
--- a/code/modules/mob/living/brain/emote.dm
+++ b/code/modules/mob/living/brain/emote.dm
@@ -59,7 +59,7 @@
log_emote("[name]/[key] : [message]")
for(var/mob/M in dead_mob_list)
- if (!M.client || istype(M, /mob/new_player))
+ if (!M.client || isnewplayer(M))
continue //skip monkeys, leavers, and new_players
if(M.stat == DEAD && (M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT)) && !(M in viewers(src,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
index f7ad95798a5..e8569861882 100644
--- a/code/modules/mob/living/brain/posibrain.dm
+++ b/code/modules/mob/living/brain/posibrain.dm
@@ -125,7 +125,7 @@ var/global/posibrain_notif_cooldown = 0
if(!usr || !src)
return
- if( (usr.disabilities & BLIND || usr.stat) && !istype(usr,/mob/dead/observer) )
+ if((usr.disabilities & BLIND || usr.stat) && !isobserver(usr))
usr << "Something is there but you can't see it."
return
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 0d934446366..2a84bfafb03 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -18,7 +18,7 @@ In all, this is a lot like the monkey code. /N
M << "You cannot attack people before the game has started."
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(isturf(loc) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
@@ -109,6 +109,7 @@ In all, this is a lot like the monkey code. /N
switch (severity)
if (1)
gib()
+ return
if (2)
take_overall_damage(60, 60)
@@ -121,4 +122,7 @@ In all, this is a lot like the monkey code. /N
adjustEarDamage(15,60)
/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 1, damage_pwr = 5, deafen_pwr = 15)
- return 0
\ No newline at end of file
+ return 0
+
+/mob/living/carbon/alien/acid_act(acidpwr, acid_volume)
+ return 0//aliens are immune to acid.
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index c9ef0237605..630c6d629c6 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -48,7 +48,7 @@ Doesn't work on other aliens/AI.*/
if(!silent)
user << "Not enough plasma stored."
return 0
- if(check_turf && (!isturf(user.loc) || istype(user.loc, /turf/open/space)))
+ if(check_turf && (!isturf(user.loc) || isspaceturf(user.loc)))
if(!silent)
user << "Bad place for a garden!"
return 0
@@ -140,30 +140,16 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user)
user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid)
-/obj/effect/proc_holder/alien/acid/proc/corrode(target,mob/living/carbon/user = usr)
+/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr)
if(target in oview(1,user))
- // OBJ CHECK
- if(isobj(target))
- var/obj/I = target
- if(I.resistance_flags & UNACIDABLE)//So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid.
- user << "You cannot dissolve this object."
- return 0
- // TURF CHECK
- else if(istype(target, /turf))
- var/turf/T = target
- // R WALL
- if(istype(T, /turf/closed/wall/r_wall))
- user << "You cannot dissolve this object."
- return 0
- // R FLOOR
- if(istype(T, /turf/open/floor/engine))
- user << "You cannot dissolve this object."
- return 0
- else// Not a type we can acid.
+ if(target.acid_act(200, 100))
+ user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")
+ return 1
+ else
+ user << "You cannot dissolve this object."
+
+
return 0
- new /obj/effect/acid(get_turf(target), target)
- user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")
- return 1
else
src << "Target is too far away."
return 0
@@ -171,8 +157,10 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user)
var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user)
- if(!O) return 0
- return corrode(O,user)
+ if(!O || user.incapacitated())
+ return 0
+ else
+ return corrode(O,user)
/mob/living/carbon/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh
set name = "Corrossive Acid"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 3a9e938df39..5ffffbd562a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -65,7 +65,7 @@
return ..()
if(A)
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/L = A
var/blocked = 0
if(ishuman(A))
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 4f08997c40f..a9b5fae735f 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -5,7 +5,7 @@
else
..()
-/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user)
+/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(15)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index 77bab6cdf04..82bb19b1475 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -18,7 +18,7 @@
visible_message("[M] has attempted to kick [src]!", \
"[M] has attempted to kick [src]!")
-/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user)
+/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(5 + rand(1,9))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 94ee29b74b0..5bc761c0faa 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -30,7 +30,7 @@
if(I && I.force)
var/d = rand(round(I.force / 4), I.force)
var/obj/item/bodypart/BP = get_bodypart("chest")
- if(BP.take_damage(d, 0))
+ if(BP.receive_damage(d, 0))
update_damage_overlays()
visible_message("[user] attacks [src]'s stomach wall with the [I.name]!", \
"[user] attacks your stomach wall with the [I.name]!")
@@ -440,6 +440,9 @@
return ..()
/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0)
+ if(dna && dna.species && NOHUNGER in dna.species.specflags)
+ return 1
+
if(nutrition < 100 && !blood)
if(message)
visible_message("[src] dry heaves!", \
@@ -498,8 +501,6 @@
update_stat()
if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD )
become_husk()
- if(on_fire)
- shred_clothing()
med_hud_set_health()
/mob/living/carbon/update_sight()
@@ -704,6 +705,13 @@
..()
+/mob/living/carbon/ExtinguishMob()
+ for(var/X in get_equipped_items())
+ var/obj/item/I = X
+ I.acid_level = 0 //washes off the acid on our clothes
+ I.extinguish() //extinguishes our clothes
+ ..()
+
/mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning")
overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER)
apply_overlay(FIRE_LAYER)
@@ -725,16 +733,20 @@
add_logs(src, C, "devoured")
/mob/living/carbon/proc/create_bodyparts()
+ var/l_arm_index_next = -1
+ var/r_arm_index_next = 0
for(var/X in bodyparts)
var/obj/item/bodypart/O = new X()
O.owner = src
bodyparts.Remove(X)
bodyparts.Add(O)
if(O.body_part == ARM_LEFT)
- O.held_index = 1
+ l_arm_index_next += 2
+ O.held_index = l_arm_index_next //1, 3, 5, 7...
hand_bodyparts += O
else if(O.body_part == ARM_RIGHT)
- O.held_index = 2
+ r_arm_index_next += 2
+ O.held_index = r_arm_index_next //2, 4, 6, 8...
hand_bodyparts += O
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index ea2195d1727..74898463ff9 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -286,3 +286,15 @@ mob/living/carbon/bullet_act(obj/item/projectile/P, def_zone)
src << "Your ears start to ring!"
src << sound('sound/weapons/flash_ring.ogg',0,1,0,250)
return effect_amount //how soundbanged we are
+
+
+/mob/living/carbon/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
+ var/bodypart_bit = 0
+ if(def_zone)
+ bodypart_bit = body_zone2body_parts_covered(def_zone)
+ for(var/X in get_equipped_items())
+ var/obj/item/I = X
+ if(I.body_parts_covered & bodypart_bit)
+ I.take_damage(0.5*damage_amount, damage_type, damage_flag, 0)
+ //0.5 multiplier for balance reason, we don't want clothes to be too easily destroyed
+
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 6da20373f62..226a4f4666a 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -18,13 +18,13 @@
switch(damagetype)
if(BRUTE)
if(BP)
- if(BP.take_damage(damage * hit_percent, 0))
+ if(BP.receive_damage(damage * hit_percent, 0))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage * hit_percent)
if(BURN)
if(BP)
- if(BP.take_damage(0, damage * hit_percent))
+ if(BP.receive_damage(0, damage * hit_percent))
update_damage_overlays()
else
adjustFireLoss(damage * hit_percent)
@@ -120,7 +120,7 @@
if(!parts.len)
return
var/obj/item/bodypart/picked = pick(parts)
- if(picked.take_damage(brute,burn))
+ if(picked.receive_damage(brute,burn))
update_damage_overlays()
@@ -162,7 +162,7 @@
var/burn_was = picked.burn_dam
- update |= picked.take_damage(brute_per_part,burn_per_part, 0)
+ update |= picked.receive_damage(brute_per_part,burn_per_part, 0)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 1f1717517df..cf9807180d9 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -14,10 +14,6 @@
//var/m_type = 1
switch(act)//Even carbon organisms want it alphabetically ordered..
- if ("aflap")
- if (!src.restrained())
- message = "[src] flaps \his wings ANGRILY!"
- m_type = 2
if ("airguitar")
if (!src.restrained())
@@ -32,10 +28,6 @@
message = "[src] blinks rapidly."
m_type = 1
- if ("blush","blushes")
- message = "[src] blushes."
- m_type = 1
-
if ("bow","bows")
if (!src.buckled)
var/M = null
@@ -82,15 +74,6 @@
message = "[src] makes a strong noise."
m_type = 2
- if ("deathgasp","deathgasps")
- message = "[src] seizes up and falls limp, \his eyes dead and lifeless..."
- m_type = 1
-
- if ("flap","flaps")
- if (!src.restrained())
- message = "[src] flaps \his wings."
- m_type = 2
-
if ("gasp","gasps")
if (!muzzled)
..(act)
@@ -116,10 +99,6 @@
..()
return
- if ("nod","nods")
- message = "[src] nods."
- m_type = 1
-
if ("scream","screams")
if (!muzzled)
..(act)
@@ -127,10 +106,6 @@
message = "[src] makes a very loud noise."
m_type = 2
- if ("shake","shakes")
- message = "[src] shakes \his head."
- m_type = 1
-
if ("sneeze","sneezes")
if (!muzzled)
..(act)
@@ -145,10 +120,6 @@
message = "[src] sighs."
m_type = 2
- if ("sniff","sniffs")
- message = "[src] sniffs."
- m_type = 2
-
if ("snore","snores")
if (!muzzled)
..(act)
@@ -188,7 +159,7 @@
// Maybe some people are okay with that.
for(var/mob/M in dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
+ if(!M.client || isnewplayer(M))
continue //skip monkeys, leavers and new players
if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 44a0a94a0d2..1e993481d38 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -1,10 +1,10 @@
/mob/living/carbon/examine(mob/user)
- var/t_He = they_pronoun(TRUE)
- var/t_His = their_pronoun(TRUE)
- var/t_his = their_pronoun()
- var/t_him = them_pronoun()
- var/t_has = get_has()
- var/t_is = get_is()
+ var/t_He = p_they(TRUE)
+ var/t_His = p_their(TRUE)
+ var/t_his = p_their()
+ var/t_him = p_them()
+ var/t_has = p_have()
+ var/t_is = p_are()
var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
@@ -37,7 +37,7 @@
if(t=="head")
msg += "[t_His] [parse_zone(t)] is missing!\n"
continue
- msg += "<[t_His] [parse_zone(t)] is missing!\n"
+ msg += "[t_His] [parse_zone(t)] is missing!\n"
msg += ""
var/temp = getBruteLoss()
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 91b85c8a40a..92e09344c46 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -24,12 +24,12 @@
switch(act) //Please keep this alphabetically ordered when adding or changing emotes.
if ("aflap") //Any emote on human that uses miming must be left in, oh well.
if (!src.restrained())
- message = "[src] flaps \his wings ANGRILY!"
+ message = "[src] flaps [p_their()] wings ANGRILY!"
m_type = 2
if ("choke","chokes")
if (miming)
- message = "[src] clutches \his throat desperately!"
+ message = "[src] clutches [p_their()] throat desperately!"
else
..(act)
@@ -70,7 +70,7 @@
message = "[src] cries."
m_type = 2
else
- message = "[src] makes a weak noise. \He frowns."
+ message = "[src] makes a weak noise. [p_they(TRUE)] frown[p_s()]."
m_type = 2
if ("custom")
@@ -121,7 +121,7 @@
if (M)
message = "[src] gives daps to [M]."
else
- message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful."
+ message = "[src] sadly can't find anybody to give daps to, and daps [p_them()]self. Shameful."
if ("eyebrow")
message = "[src] raises an eyebrow."
@@ -129,7 +129,7 @@
if ("flap","flaps")
if (!src.restrained())
- message = "[src] flaps \his wings."
+ message = "[src] flaps [p_their()] wings."
m_type = 2
if(((dna.features["wings"] != "None") && !("wings" in dna.species.mutant_bodyparts)))
OpenWings()
@@ -138,10 +138,10 @@
if ("wings")
if (!src.restrained())
if(dna && dna.species &&((dna.features["wings"] != "None") && ("wings" in dna.species.mutant_bodyparts)))
- message = "[src] opens \his wings."
+ message = "[src] opens [p_their()] wings."
OpenWings()
else if(dna && dna.species &&((dna.features["wings"] != "None") && ("wingsopen" in dna.species.mutant_bodyparts)))
- message = "[src] closes \his wings."
+ message = "[src] closes [p_their()] wings."
CloseWings()
else
src << "Unusable emote '[act]'. Say *help for a list."
@@ -191,7 +191,7 @@
if (M.canmove && M.get_empty_held_indexes() && !M.restrained())
message = "[src] shakes hands with [M]."
else
- message = "[src] holds out \his hand to [M]."
+ message = "[src] holds out [p_their()] hand to [M]."
if ("hug","hugs")
m_type = 1
@@ -207,7 +207,7 @@
if (M)
message = "[src] hugs [M]."
else
- message = "[src] hugs \himself."
+ message = "[src] hugs [p_them()]self."
if ("me")
if(silent)
@@ -339,7 +339,7 @@
if("wag","wags")
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || ((dna.features["tail_human"] != "None") && !("waggingtail_human" in dna.species.mutant_bodyparts))))
- message = "[src] wags \his tail."
+ message = "[src] wags [p_their()] tail."
startTailWag()
else if(dna && dna.species && (("waggingtail_lizard" in dna.species.mutant_bodyparts) || ("waggingtail_human" in dna.species.mutant_bodyparts)))
endTailWag()
@@ -364,7 +364,7 @@
// Maybe some people are okay with that.
for(var/mob/M in dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
+ if(!M.client || isnewplayer(M))
continue //skip monkeys, leavers and new players
if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index dc076f45497..487da019e74 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -1,11 +1,11 @@
/mob/living/carbon/human/examine(mob/user)
//this is very slightly better than it was because you can use it more places. still can't do \his[src] though.
- var/t_He = they_pronoun(TRUE)
- var/t_His = their_pronoun(TRUE)
- var/t_his = their_pronoun()
- var/t_him = them_pronoun()
- var/t_has = get_has()
- var/t_is = get_is()
+ var/t_He = p_they(TRUE)
+ var/t_His = p_their(TRUE)
+ var/t_his = p_their()
+ var/t_him = p_them()
+ var/t_has = p_have()
+ var/t_is = p_are()
var/msg = "*---------*\nThis is [src.name]!\n"
@@ -142,7 +142,7 @@
appears_dead = 1
if(getorgan(/obj/item/organ/brain))//Only perform these checks if there is no brain
if(suiciding)
- msg += "[t_He] appears to have commited suicide... there is no hope of recovery.\n"
+ msg += "[t_He] appear[p_s()] to have commited suicide... there is no hope of recovery.\n"
if(hellbound)
msg += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.\n"
msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life"
@@ -263,7 +263,7 @@
if(61.01 to 91)
msg += "[t_He] looks like a drunken mess.\n"
if(91.01 to INFINITY)
- msg += "[t_He] is a shitfaced, slobbering wreck.\n"
+ msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
msg += ""
@@ -306,10 +306,10 @@
msg += "Detected cybernetic modifications: "
msg += implant_detect
if(R)
- var/health = R.fields["p_stat"]
- msg += "\[[health]\]"
- health = R.fields["m_stat"]
- msg += "\[[health]\] "
+ var/health_r = R.fields["p_stat"]
+ msg += "\[[health_r]\]"
+ health_r = R.fields["m_stat"]
+ msg += "\[[health_r]\] "
R = find_record("name", perpname, data_core.medical)
if(R)
msg += "\[Medical evaluation\] "
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 833d5c1772d..d8d22fceb35 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -219,8 +219,8 @@
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
- L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
- I.loc = get_turf(src)
+ L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
+ I.forceMove(get_turf(src))
usr.put_in_hands(I)
usr.emote("scream")
usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].")
@@ -272,7 +272,7 @@
///////HUDs///////
if(href_list["hud"])
- if(istype(usr, /mob/living/carbon/human))
+ if(ishuman(usr))
var/mob/living/carbon/human/H = usr
var/perpname = get_face_name(get_id_name(""))
if(istype(H.glasses, /obj/item/clothing/glasses/hud))
@@ -294,24 +294,24 @@
if(href_list["hud"] == "m")
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
if(href_list["p_stat"])
- var/health = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel")
+ var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel")
if(R)
if(!H.canUseHUD())
return
else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health))
return
- if(health && health != "Cancel")
- R.fields["p_stat"] = health
+ if(health_status && health_status != "Cancel")
+ R.fields["p_stat"] = health_status
return
if(href_list["m_stat"])
- var/health = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel")
+ var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel")
if(R)
if(!H.canUseHUD())
return
else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health))
return
- if(health && health != "Cancel")
- R.fields["m_stat"] = health
+ if(health_status && health_status != "Cancel")
+ R.fields["m_stat"] = health_status
return
if(href_list["evaluation"])
if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20)
@@ -496,7 +496,7 @@
. = 0
if(!. && error_msg && user)
// Might need re-wording.
- user << "There is no exposed flesh or thin material [above_neck(target_zone) ? "on [their_pronoun()] head" : "on [their_pronoun()] body"]."
+ user << "There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"]."
/mob/living/carbon/human/proc/check_obscured_slots()
var/list/obscured = list()
@@ -630,7 +630,7 @@
src << "Remove your mask first!"
return 0
if(C.is_mouth_covered())
- src << "Remove [their_pronoun()] mask first!"
+ src << "Remove [p_their()] mask first!"
return 0
if(C.cpr_time < world.time + 30)
@@ -884,7 +884,6 @@
override = dna.species.override_float
..()
-
/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0)
if(blood && (NOBLOOD in dna.species.specflags))
if(message)
@@ -893,4 +892,4 @@
if(stun)
Weaken(10)
return 1
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 766a37aad4a..cf7908ce2ef 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -18,8 +18,8 @@
return (armorval/max(organnum, 1))
-/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, type)
- if(!type)
+/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, d_type)
+ if(!d_type)
return 0
var/protection = 0
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
@@ -29,7 +29,7 @@
if(bp && istype(bp ,/obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
- protection += C.armor[type]
+ protection += C.armor[d_type]
return protection
///checkeyeprot()
@@ -139,7 +139,7 @@
L.embedded_objects |= I
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.loc = src
- L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
+ L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
visible_message("\the [I.name] embeds itself in [src]'s [L.name]!","\the [I.name] embeds itself in your [L.name]!")
hitpush = 0
skipcatch = 1 //can't catch the now embedded item
@@ -171,7 +171,7 @@
return dna.species.spec_attacked_by(I, user, affecting, a_intent, src)
-/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user)
+/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
playsound(loc, user.dna.species.attack_sound, 25, 1, -1)
@@ -179,6 +179,7 @@
visible_message("[user] has [hulk_verb]ed [src]!", \
"[user] has [hulk_verb]ed [src]!")
adjustBruteLoss(15)
+ damage_clothes(15, BRUTE, "melee")
return 1
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
@@ -190,7 +191,8 @@
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
-
+ if(!affecting)
+ affecting = get_bodypart("chest")
if(M.a_intent == "help")
..() //shaking
return 0
@@ -203,6 +205,7 @@
var/damage = rand(1, 3)
if(stat != DEAD)
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
return 1
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M)
@@ -221,6 +224,8 @@
"[M] has lunged at [src]!")
return 0
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor_block = run_armor_check(affecting, "melee","","",10)
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
@@ -230,6 +235,7 @@
if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful
return 1
apply_damage(damage, BRUTE, affecting, armor_block)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
if(M.a_intent == "disarm") //Always drop item in hand, if no item, get stunned instead.
if(get_active_held_item() && drop_item())
@@ -253,8 +259,11 @@
if(stat != DEAD)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
@@ -266,9 +275,11 @@
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration)
apply_damage(damage, M.melee_damage_type, affecting, armor)
-
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M)
@@ -285,8 +296,11 @@
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
@@ -297,15 +311,18 @@
var/obj/item/bodypart/temp = get_bodypart(pick("chest", "chest", "chest", "head"))
if(temp)
var/update = 0
+ var/dmg = rand(M.force/2, M.force)
switch(M.damtype)
if("brute")
if(M.force > 20)
Paralyse(1)
- update |= temp.take_damage(rand(M.force/2, M.force), 0)
+ update |= temp.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
+ damage_clothes(dmg, BRUTE, "melee", temp.body_zone)
if("fire")
- update |= temp.take_damage(0, rand(M.force/2, M.force))
+ update |= temp.receive_damage(0, dmg)
playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ damage_clothes(dmg, BURN, "melee", temp.body_zone)
if("tox")
M.mech_toxin_damage(src)
else
@@ -323,17 +340,17 @@
/mob/living/carbon/human/ex_act(severity, ex_target)
- var/b_loss = null
- var/f_loss = null
- var/bomb_armor = getarmor(null, "bomb")
+
if(istype(ex_target, /datum/spacevine_mutation) && isvineimmune(src))
return
+ var/b_loss = 0
+ var/f_loss = 0
+ var/bomb_armor = getarmor(null, "bomb")
switch (severity)
if (1)
- b_loss += 500
- if (prob(bomb_armor))
- shred_clothing(1,150)
+ if(prob(bomb_armor))
+ b_loss = 500
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
else
@@ -341,15 +358,11 @@
return
if (2)
- b_loss += 60
-
- f_loss += 60
- if (prob(bomb_armor))
- b_loss = b_loss/1.5
- f_loss = f_loss/1.5
- shred_clothing(1,25)
- else
- shred_clothing(1,50)
+ b_loss = 60
+ f_loss = 60
+ if(bomb_armor)
+ b_loss = 30*(2 - round(bomb_armor*0.01, 0.05))
+ f_loss = b_loss
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(30, 120)
@@ -357,15 +370,20 @@
Paralyse(10)
if(3)
- b_loss += 30
- if (prob(bomb_armor))
- b_loss = b_loss/2
+ b_loss = 30
+ if(bomb_armor)
+ b_loss = 15*(2 - round(bomb_armor*0.01, 0.05))
+
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(15,60)
if (prob(50))
Paralyse(8)
take_overall_damage(b_loss,f_loss)
+ if(bomb_armor == 100) //full bomb armor set, we don't call contents_explosion
+ flash_act()
+ return
+
//attempt to dismember bodyparts
if(severity <= 2 || !bomb_armor)
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
@@ -426,131 +444,129 @@
informed = 1
switch(severity)
if(1)
- L.take_damage(0,10)
+ L.receive_damage(0,10)
src.Stun(10)
if(2)
- L.take_damage(0,5)
+ L.receive_damage(0,5)
src.Stun(5)
..()
-/mob/living/carbon/human/acid_act(acidpwr, toxpwr, acid_volume)
+/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit)
var/list/damaged = list()
var/list/inventory_items_to_kill = list()
- var/acidity = min(acidpwr*acid_volume/200, toxpwr)
- var/acid_volume_left = acid_volume
- var/acid_decay = 100/acidpwr // how much volume we lose per item we try to melt. 5 for fluoro, 10 for sulphuric
-
+ var/acidity = acidpwr * min(acid_volume*0.005, 0.1)
//HEAD//
- var/obj/item/clothing/head_clothes = null
- if(glasses)
- head_clothes = glasses
- if(wear_mask)
- head_clothes = wear_mask
- if(head)
- head_clothes = head
- if(head_clothes)
- if(!(head_clothes.resistance_flags & UNACIDABLE))
- head_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0) //We remove some of the acid volume.
- update_inv_glasses()
- update_inv_wear_mask()
- update_inv_head()
+ if(!bodyzone_hit || bodyzone_hit == "head") //only if we didn't specify a zone or if that zone is the head.
+ var/obj/item/clothing/head_clothes = null
+ if(glasses)
+ head_clothes = glasses
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ if(!(head_clothes.resistance_flags & UNACIDABLE))
+ head_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_glasses()
+ update_inv_wear_mask()
+ update_inv_head()
+ else
+ src << "Your [head_clothes.name] protects your head and face from the acid!"
else
- src << "Your [head_clothes.name] protects your head and face from the acid!"
- else
- . = get_bodypart("head")
- if(.)
- damaged += .
- if(ears)
- inventory_items_to_kill += ears
+ . = get_bodypart("head")
+ if(.)
+ damaged += .
+ if(ears)
+ inventory_items_to_kill += ears
//CHEST//
- var/obj/item/clothing/chest_clothes = null
- if(w_uniform)
- chest_clothes = w_uniform
- if(wear_suit)
- chest_clothes = wear_suit
- if(chest_clothes)
- if(!(chest_clothes.resistance_flags & UNACIDABLE))
- chest_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
- update_inv_w_uniform()
- update_inv_wear_suit()
+ if(!bodyzone_hit || bodyzone_hit == "chest")
+ var/obj/item/clothing/chest_clothes = null
+ if(w_uniform)
+ chest_clothes = w_uniform
+ if(wear_suit)
+ chest_clothes = wear_suit
+ if(chest_clothes)
+ if(!(chest_clothes.resistance_flags & UNACIDABLE))
+ chest_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+ else
+ src << "Your [chest_clothes.name] protects your body from the acid!"
else
- src << "Your [chest_clothes.name] protects your body from the acid!"
- else
- . = get_bodypart("chest")
- if(.)
- damaged += .
- if(wear_id)
- inventory_items_to_kill += wear_id
- if(r_store)
- inventory_items_to_kill += r_store
- if(l_store)
- inventory_items_to_kill += l_store
- if(s_store)
- inventory_items_to_kill += s_store
+ . = get_bodypart("chest")
+ if(.)
+ damaged += .
+ if(wear_id)
+ inventory_items_to_kill += wear_id
+ if(r_store)
+ inventory_items_to_kill += r_store
+ if(l_store)
+ inventory_items_to_kill += l_store
+ if(s_store)
+ inventory_items_to_kill += s_store
//ARMS & HANDS//
- var/obj/item/clothing/arm_clothes = null
- if(gloves)
- arm_clothes = gloves
- if(w_uniform && (w_uniform.body_parts_covered & HANDS) || w_uniform && (w_uniform.body_parts_covered & ARMS))
- arm_clothes = w_uniform
- if(wear_suit && (wear_suit.body_parts_covered & HANDS) || wear_suit && (wear_suit.body_parts_covered & ARMS))
- arm_clothes = wear_suit
- if(arm_clothes)
- if(!(arm_clothes.resistance_flags & UNACIDABLE))
- arm_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
- update_inv_gloves()
- update_inv_w_uniform()
- update_inv_wear_suit()
+ if(!bodyzone_hit || bodyzone_hit == "l_arm" || bodyzone_hit == "r_arm")
+ var/obj/item/clothing/arm_clothes = null
+ if(gloves)
+ arm_clothes = gloves
+ if(w_uniform && ((w_uniform.body_parts_covered & HANDS) || (w_uniform.body_parts_covered & ARMS)))
+ arm_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & HANDS) || (wear_suit.body_parts_covered & ARMS)))
+ arm_clothes = wear_suit
+
+ if(arm_clothes)
+ if(!(arm_clothes.resistance_flags & UNACIDABLE))
+ arm_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_gloves()
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+ else
+ src << "Your [arm_clothes.name] protects your arms and hands from the acid!"
else
- src << "Your [arm_clothes.name] protects your arms and hands from the acid!"
- else
- . = get_bodypart("r_arm")
- if(.)
- damaged += .
- . = get_bodypart("l_arm")
- if(.)
- damaged += .
+ . = get_bodypart("r_arm")
+ if(.)
+ damaged += .
+ . = get_bodypart("l_arm")
+ if(.)
+ damaged += .
//LEGS & FEET//
- var/obj/item/clothing/leg_clothes = null
- if(shoes)
- leg_clothes = shoes
- if(w_uniform && (w_uniform.body_parts_covered & FEET) || w_uniform && (w_uniform.body_parts_covered & LEGS))
- leg_clothes = w_uniform
- if(wear_suit && (wear_suit.body_parts_covered & FEET) || wear_suit && (wear_suit.body_parts_covered & LEGS))
- leg_clothes = wear_suit
- if(leg_clothes)
- if(!(leg_clothes.resistance_flags & UNACIDABLE))
- leg_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
- update_inv_shoes()
- update_inv_w_uniform()
- update_inv_wear_suit()
+ if(!bodyzone_hit || bodyzone_hit == "l_leg" || bodyzone_hit == "r_leg" || bodyzone_hit == "feet")
+ var/obj/item/clothing/leg_clothes = null
+ if(shoes)
+ leg_clothes = shoes
+ if(w_uniform && ((w_uniform.body_parts_covered & FEET) || (bodyzone_hit != "feet" && (w_uniform.body_parts_covered & LEGS))))
+ leg_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & FEET) || (bodyzone_hit != "feet" && (wear_suit.body_parts_covered & LEGS))))
+ leg_clothes = wear_suit
+ if(leg_clothes)
+ if(!(leg_clothes.resistance_flags & UNACIDABLE))
+ leg_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_shoes()
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+ else
+ src << "Your [leg_clothes.name] protects your legs and feet from the acid!"
else
- src << "Your [leg_clothes.name] protects your legs and feet from the acid!"
- else
- . = get_bodypart("r_leg")
- if(.)
- damaged += .
- . = get_bodypart("l_leg")
- if(.)
- damaged += .
+ . = get_bodypart("r_leg")
+ if(.)
+ damaged += .
+ . = get_bodypart("l_leg")
+ if(.)
+ damaged += .
//DAMAGE//
for(var/obj/item/bodypart/affecting in damaged)
- affecting.take_damage(acidity, 2*acidity)
+ affecting.receive_damage(acidity, 2*acidity)
if(affecting.name == "head")
if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement
- affecting.take_damage(acidity, 2*acidity)
+ affecting.receive_damage(acidity, 2*acidity)
emote("scream")
facial_hair_style = "Shaved"
hair_style = "Bald"
@@ -561,17 +577,17 @@
//MELTING INVENTORY ITEMS//
//these items are all outside of armour visually, so melt regardless.
- if(back)
- inventory_items_to_kill += back
- if(belt)
- inventory_items_to_kill += belt
+ if(!bodyzone_hit)
+ if(back)
+ inventory_items_to_kill += back
+ if(belt)
+ inventory_items_to_kill += belt
- inventory_items_to_kill += held_items
+ inventory_items_to_kill += held_items
for(var/obj/item/I in inventory_items_to_kill)
- I.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
-
+ I.acid_act(acidpwr, acid_volume)
+ return 1
/mob/living/carbon/human/singularity_act()
var/gain = 20
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 4d82003dadf..e175fec7d3e 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -200,100 +200,6 @@
sec_hud_set_security_status()
..()
-
-
-
-//Cycles through all clothing slots and tests them for destruction
-/mob/living/carbon/proc/shred_clothing(bomb,shock)
- if(back)
- back.shred(bomb,shock-20,src)
- if(head)
- head.shred(bomb,shock,src)
- if(wear_mask)
- wear_mask.shred(bomb,shock,src)
-
-
-/mob/living/carbon/human/shred_clothing(bomb,shock)
- var/covered_parts = 0 //The body parts that are protected by exterior clothing/armor
- var/head_absorbed = 0 //How much of the shock the headgear absorbs when it is shredded. -1=it survives
- var/suit_absorbed = 0 //How much of the shock the exosuit absorbs when it is shredded. -1=it survives
-
- //Backpacks can never be protected but are annoying as fuck to lose, so they get a lower chance to be shredded
- if(back)
- back.shred(bomb,shock-20,src)
-
- if(head)
- covered_parts |= head.flags_inv
- head_absorbed = head.shred(bomb,shock,src)
- if(wear_mask)
- var/absorbed = ((covered_parts & HIDEMASK) ? head_absorbed : 0) //Check if clothing covering this part absorbed any of the shock
- if(absorbed >= 0)
- //Masks can be used to shield other parts, but are simplified to simply add their absorbsion to the head armor if it covers the face
- var/mask_absorbed = wear_mask.shred(bomb,shock-absorbed,src)
- if(wear_mask.flags_inv & HIDEFACE)
- covered_parts |= wear_mask.flags_inv
- if(mask_absorbed < 0) //If the mask didn't get shredded, everything else on the head is protected
- head_absorbed = -1
- else
- head_absorbed += mask_absorbed
- if(ears)
- var/absorbed = ((covered_parts & HIDEEARS) ? head_absorbed : 0)
- if(absorbed >= 0)
- ears.shred(bomb,shock-absorbed,src)
- if(glasses)
- var/absorbed = ((covered_parts & HIDEEYES) ? head_absorbed : 0)
- if(absorbed >= 0)
- glasses.shred(bomb,shock-absorbed,src)
-
- if(wear_suit)
- covered_parts |= wear_suit.flags_inv
- suit_absorbed = wear_suit.shred(bomb,shock,src)
- if(gloves)
- var/absorbed = ((covered_parts & HIDEGLOVES) ? suit_absorbed : 0)
- if(absorbed >= 0)
- gloves.shred(bomb,shock-absorbed,src)
- if(shoes)
- var/absorbed = ((covered_parts & HIDESHOES) ? suit_absorbed : 0)
- if(absorbed >= 0)
- shoes.shred(bomb,shock-absorbed,src)
- if(w_uniform)
- var/absorbed = ((covered_parts & HIDEJUMPSUIT) ? suit_absorbed : 0)
- if(absorbed >= 0)
- w_uniform.shred(bomb,shock-20-absorbed,src) //Uniforms are also annoying to get shredded
-
-/obj/item/proc/shred(bomb,shock,mob/living/carbon/human/Human)
- if(flags & ABSTRACT)
- return -1
-
- var/shredded
-
- if(!bomb)
- if(!(resistance_flags & FIRE_PROOF))
- shredded = 1 //No heat protection, it burns
- else
- shredded = -1 //Heat protection = Fireproof
-
- else if(shock > 0)
- if(prob(max(shock-armor["bomb"],0)))
- shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount
- else
- shredded = -1 //It survives explosion
-
- if(shredded > 0)
- if(Human) //Unequip if equipped
- Human.unEquip(src)
-
- if(bomb)
- empty_object_contents()
- spawn(1) //so the shreds aren't instantly deleted by the explosion
- var/obj/effect/decal/cleanable/shreds/Shreds = new(loc)
- Shreds.desc = "The sad remains of what used to be [src.name]."
- qdel(src)
- else
- burn()
-
- return shredded
-
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
var/datum/outfit/O = null
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 5d7003106aa..4a67cb15236 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -103,6 +103,72 @@
if(!dna || !dna.species.handle_fire(src))
..()
if(on_fire)
+
+ //the fire tries to damage the exposed clothes and items
+ var/list/burning_items = list()
+ //HEAD//
+ var/obj/item/clothing/head_clothes = null
+ if(glasses)
+ head_clothes = glasses
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ burning_items += head_clothes
+ else if(ears)
+ burning_items += ears
+
+ //CHEST//
+ var/obj/item/clothing/chest_clothes = null
+ if(w_uniform)
+ chest_clothes = w_uniform
+ if(wear_suit)
+ chest_clothes = wear_suit
+ else
+ if(wear_id)
+ burning_items += wear_id
+ if(r_store)
+ burning_items += r_store
+ if(l_store)
+ burning_items += l_store
+ if(s_store)
+ burning_items += s_store
+ if(chest_clothes)
+ burning_items += chest_clothes
+
+ //ARMS & HANDS//
+ var/obj/item/clothing/arm_clothes = null
+ if(gloves)
+ arm_clothes = gloves
+ if(w_uniform && ((w_uniform.body_parts_covered & HANDS) || (w_uniform.body_parts_covered & ARMS)))
+ arm_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & HANDS) || (wear_suit.body_parts_covered & ARMS)))
+ arm_clothes = wear_suit
+ if(arm_clothes)
+ burning_items += arm_clothes
+
+ //LEGS & FEET//
+ var/obj/item/clothing/leg_clothes = null
+ if(shoes)
+ leg_clothes = shoes
+ if(w_uniform && ((w_uniform.body_parts_covered & FEET) || (w_uniform.body_parts_covered & LEGS)))
+ leg_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & FEET) || (wear_suit.body_parts_covered & LEGS)))
+ leg_clothes = wear_suit
+ if(leg_clothes)
+ burning_items += leg_clothes
+
+ if(back)
+ burning_items += back
+ if(belt)
+ burning_items += belt
+
+ for(var/X in burning_items)
+ var/obj/item/I = X
+ if(!(I.resistance_flags & FIRE_PROOF))
+ I.take_damage(fire_stacks, BURN, "fire", 0)
+
var/thermal_protection = get_thermal_protection()
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
@@ -293,11 +359,11 @@
var/obj/item/bodypart/BP = X
for(var/obj/item/I in BP.embedded_objects)
if(prob(I.embedded_pain_chance))
- BP.take_damage(I.w_class*I.embedded_pain_multiplier)
+ BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
src << "\the [I] embedded in your [BP.name] hurts!"
if(prob(I.embedded_fall_chance))
- BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier)
+ BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
BP.embedded_objects -= I
I.loc = get_turf(src)
visible_message("\the [I] falls out of [name]'s [BP.name]!","\the [I] falls out of your [BP.name]!")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index f250fa7cb85..0a26478c0c0 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -932,7 +932,117 @@
// ATTACK PROCS //
//////////////////
-/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H)
+//////////////////
+// ATTACK PROCS //
+//////////////////
+
+/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
+ if(target.health >= 0 && !(target.status_flags & FAKEDEATH))
+ target.help_shake_act(user)
+ if(target != user)
+ add_logs(user, target, "shaked")
+ return 1
+ else
+ var/we_breathe = (!(NOBREATH in user.dna.species.specflags))
+ var/we_lung = user.getorganslot("lungs")
+
+ if(we_breathe && we_lung)
+ user.do_cpr(target)
+ else if(we_breathe && !we_lung)
+ user << "You have no lungs to breathe with, so you cannot peform CPR."
+ else
+ user << "You do not breathe, so you cannot perform CPR."
+
+/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
+ if(attacker_style && attacker_style.grab_act(user,target))
+ return 1
+ else
+ target.grabbedby(user)
+ return 1
+
+/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
+ if(attacker_style && attacker_style.harm_act(user,target))
+ return 1
+ else
+ user.do_attack_animation(target)
+
+ var/atk_verb = user.dna.species.attack_verb
+ if(target.lying)
+ atk_verb = "kick"
+
+ var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
+
+ var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
+
+ if(!damage || !affecting)
+ playsound(target.loc, user.dna.species.miss_sound, 25, 1, -1)
+ target.visible_message("[user] has attempted to [atk_verb] [target]!")
+ return 0
+
+
+ var/armor_block = target.run_armor_check(affecting, "melee")
+
+ playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1)
+
+ target.visible_message("[user] has [atk_verb]ed [target]!", \
+ "[user] has [atk_verb]ed [target]!")
+
+ if(user.limb_destroyer)
+ target.dismembering_strike(user, affecting.body_zone)
+ target.apply_damage(damage, BRUTE, affecting, armor_block)
+ add_logs(user, target, "punched")
+ if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
+ target.visible_message("[user] has weakened [target]!", \
+ "[user] has weakened [target]!")
+ target.apply_effect(4, WEAKEN, armor_block)
+ target.forcesay(hit_appends)
+ else if(target.lying)
+ target.forcesay(hit_appends)
+
+/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
+ if(attacker_style && attacker_style.disarm_act(user,target))
+ return 1
+ else
+ user.do_attack_animation(target)
+ add_logs(user, target, "disarmed")
+
+ if(target.w_uniform)
+ target.w_uniform.add_fingerprint(user)
+ var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
+ var/randn = rand(1, 100)
+ if(randn <= 25)
+ playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ target.visible_message("[user] has pushed [target]!",
+ "[user] has pushed [target]!")
+ target.apply_effect(2, WEAKEN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
+ target.forcesay(hit_appends)
+ return
+
+ var/talked = 0 // BubbleWrap
+
+ if(randn <= 60)
+ //BubbleWrap: Disarming breaks a pull
+ if(target.pulling)
+ target.visible_message("[user] has broken [target]'s grip on [target.pulling]!")
+ talked = 1
+ target.stop_pulling()
+ //End BubbleWrap
+
+ if(!talked) //BubbleWrap
+ if(target.drop_item())
+ target.visible_message("[user] has disarmed [target]!", \
+ "[user] has disarmed [target]!")
+ playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ return
+
+
+ playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ target.visible_message("[user] attempted to disarm [target]!", \
+ "[user] attemped to disarm [target]!")
+ return
+
+
+/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
if(!istype(M))
return
CHECK_DNA_AND_SPECIES(M)
@@ -944,113 +1054,18 @@
add_logs(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]!")
return 0
-
- var/datum/martial_art/attacker_style = M.martial_art
-
switch(M.a_intent)
if("help")
- if(H.health >= 0 && !(H.status_flags & FAKEDEATH))
- H.help_shake_act(M)
- if(H != M)
- add_logs(M, H, "shaked")
- return 1
- else
- var/we_breathe = (!(NOBREATH in M.dna.species.specflags))
- var/we_lung = M.getorganslot("lungs")
-
- if(we_breathe && we_lung)
- M.do_cpr(H)
- else if(we_breathe && !we_lung)
- M << "You have no lungs to breathe with, so you cannot peform CPR."
- else
- M << "You do not breathe, so you cannot perform CPR."
+ help(M, H, attacker_style)
if("grab")
- if(attacker_style && attacker_style.grab_act(M,H))
- return 1
- else
- H.grabbedby(M)
- return 1
+ grab(M, H, attacker_style)
if("harm")
- if(attacker_style && attacker_style.harm_act(M,H))
- return 1
- else
- M.do_attack_animation(H)
+ harm(M, H, attacker_style)
- var/atk_verb = M.dna.species.attack_verb
- if(H.lying)
- atk_verb = "kick"
-
- var/damage = rand(M.dna.species.punchdamagelow, M.dna.species.punchdamagehigh)
-
- var/obj/item/bodypart/affecting = H.get_bodypart(ran_zone(M.zone_selected))
-
- if(!damage || !affecting)
- playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1)
- H.visible_message("[M] has attempted to [atk_verb] [H]!")
- return 0
-
-
- var/armor_block = H.run_armor_check(affecting, "melee")
-
- playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1)
-
- H.visible_message("[M] has [atk_verb]ed [H]!", \
- "[M] has [atk_verb]ed [H]!")
-
- if(M.limb_destroyer)
- H.dismembering_strike(M, affecting.body_zone)
- H.apply_damage(damage, BRUTE, affecting, armor_block)
- add_logs(M, H, "punched")
- if((H.stat != DEAD) && damage >= M.dna.species.punchstunthreshold)
- H.visible_message("[M] has weakened [H]!", \
- "[M] has weakened [H]!")
- H.apply_effect(4, WEAKEN, armor_block)
- H.forcesay(hit_appends)
- else if(H.lying)
- H.forcesay(hit_appends)
if("disarm")
- if(attacker_style && attacker_style.disarm_act(M,H))
- return 1
- else
- M.do_attack_animation(H)
- add_logs(M, H, "disarmed")
-
- if(H.w_uniform)
- H.w_uniform.add_fingerprint(M)
- var/obj/item/bodypart/affecting = H.get_bodypart(ran_zone(M.zone_selected))
- var/randn = rand(1, 100)
- if(randn <= 25)
- playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- H.visible_message("[M] has pushed [H]!",
- "[M] has pushed [H]!")
- H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
- H.forcesay(hit_appends)
- return
-
- var/talked = 0 // BubbleWrap
-
- if(randn <= 60)
- //BubbleWrap: Disarming breaks a pull
- if(H.pulling)
- H.visible_message("[M] has broken [H]'s grip on [H.pulling]!")
- talked = 1
- H.stop_pulling()
- //End BubbleWrap
-
- if(!talked) //BubbleWrap
- if(H.drop_item())
- H.visible_message("[M] has disarmed [H]!", \
- "[M] has disarmed [H]!")
- playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- return
-
-
- playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- H.visible_message("[M] attempted to disarm [H]!", \
- "[M] attemped to disarm [H]!")
- return
+ disarm(M, H, attacker_style)
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
// Allows you to put in item-specific reactions based on species
@@ -1071,6 +1086,7 @@
var/weakness = H.check_weakness(I, user)
apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H)
+ H.damage_clothes(I.force, BRUTE, "melee", affecting.body_zone)
H.send_item_attack_message(I, user, hit_area)
@@ -1157,14 +1173,14 @@
if(BRUTE)
H.damageoverlaytemp = 20
if(BP)
- if(BP.take_damage(damage * hit_percent * brutemod, 0))
+ if(BP.receive_damage(damage * hit_percent * brutemod, 0))
H.update_damage_overlays()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage * hit_percent * brutemod)
if(BURN)
H.damageoverlaytemp = 20
if(BP)
- if(BP.take_damage(0, damage * hit_percent * burnmod))
+ if(BP.receive_damage(0, damage * hit_percent * burnmod))
H.update_damage_overlays()
else
H.adjustFireLoss(damage * hit_percent* burnmod)
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index faeda3530d7..e73d3d4bbf4 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -18,14 +18,6 @@
return 1 //Pure humans are always allowed in all roles.
return ..()
-
-/datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
- if(chem.id == "mutationtoxin")
- H << "Your flesh rapidly mutates!"
- H.set_species(/datum/species/jelly/slime)
- H.reagents.del_reagent(chem.type)
- return 1
-
//Curiosity killed the cat's wagging tail.
/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 951d93d9238..5080e0fb54a 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -59,13 +59,13 @@
watching -= eavesdropping
var/rendered
- whispers = critical ? "whispers something in [their_pronoun()] final breath." : "whispers something."
+ whispers = critical ? "whispers something in [p_their()] final breath." : "whispers something."
rendered = "[src.name] [whispers]"
for(var/mob/M in watching)
M.show_message(rendered, 2)
var/spans = list(SPAN_ITALICS)
- whispers = critical ? "whispers in [their_pronoun()] final breath" : "whispers"
+ whispers = critical ? "whispers in [p_their()] final breath" : "whispers"
rendered = "[GetVoice()][alt_name] [whispers], \"[attach_spans(message, spans)]\""
for(var/atom/movable/AM in listening)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 3e87fa5c1ab..d879cdb128b 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -142,7 +142,27 @@
return 1
/mob/living/carbon/monkey/handle_fire()
- if(..())
- return
- bodytemperature += BODYTEMP_HEATING_MAX
- return
+ . = ..()
+ if(on_fire)
+
+ //the fire tries to damage the exposed clothes and items
+ var/list/burning_items = list()
+ //HEAD//
+ var/obj/item/clothing/head_clothes = null
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ burning_items += head_clothes
+
+ if(back)
+ burning_items += back
+
+ for(var/X in burning_items)
+ var/obj/item/I = X
+ if(!(I.resistance_flags & FIRE_PROOF))
+ I.take_damage(fire_stacks, BURN, "fire", 0)
+
+ bodytemperature += BODYTEMP_HEATING_MAX
+
diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
index 112999aff67..39b2637cc1c 100644
--- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
@@ -17,10 +17,14 @@
if(..()) //successful monkey bite.
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
if(M.limb_destroyer)
dismembering_strike(M, affecting.body_zone)
if(stat != DEAD)
- apply_damage(rand(1, 5), BRUTE, affecting)
+ var/dmg = rand(1, 5)
+ apply_damage(dmg, BRUTE, affecting)
+ damage_clothes(dmg, BRUTE, "melee", affecting.body_zone)
@@ -30,7 +34,10 @@
if(stat != DEAD)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M)
if(..()) //To allow surgery to return properly.
@@ -56,7 +63,10 @@
visible_message("[M] has knocked out [name]!", \
"[M] has knocked out [name]!")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
add_logs(M, src, "attacked")
else
@@ -96,9 +106,12 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
add_logs(M, src, "attacked")
- if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful
+ if(!affecting)
+ affecting = get_bodypart("chest")
+ if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful
return 1
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
@@ -126,7 +139,10 @@
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, M.melee_damage_type, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
@@ -139,19 +155,28 @@
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
-/mob/living/carbon/monkey/acid_act(acidpwr, toxpwr, acid_volume)
- if(wear_mask)
- if(!(wear_mask.resistance_flags & UNACIDABLE))
- wear_mask.acid_act(acidpwr)
- update_inv_wear_mask()
- else
- src << "Your mask protects you from the acid."
- return
-
- take_bodypart_damage(min(6*toxpwr, acid_volume * acidpwr/10))
+/mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit)
+ . = 1
+ if(!bodyzone_hit || bodyzone_hit == "head")
+ if(wear_mask)
+ if(!(wear_mask.resistance_flags & UNACIDABLE))
+ wear_mask.acid_act(acidpwr)
+ else
+ src << "Your mask protects you from the acid."
+ return
+ if(head)
+ if(!(head.resistance_flags & UNACIDABLE))
+ head.acid_act(acidpwr)
+ else
+ src << "Your hat protects you from the acid."
+ return
+ take_bodypart_damage(acidpwr * min(0.6, acid_volume*0.1))
/mob/living/carbon/monkey/ex_act(severity, target)
@@ -160,10 +185,10 @@
switch (severity)
if (1)
gib()
+ return
if (2)
take_overall_damage(60, 60)
- shred_clothing(1,50)
adjustEarDamage(30, 120)
if(prob(70))
Paralyse(10)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 8145741e009..aac93543fca 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -19,7 +19,7 @@
switch(act)//Hello, how would you like to order? Alphabetically!
if ("aflap")
if (!src.restrained())
- message = "[src] flaps its wings ANGRILY!"
+ message = "[src] flaps [p_their()] wings ANGRILY!"
m_type = 2
if ("blush","blushes")
@@ -51,7 +51,7 @@
m_type = 2
if ("cross","crosses")
- message = "[src] crosses their arms."
+ message = "[src] crosses [p_their()] arms."
m_type = 2
if ("chuckle","chuckles")
@@ -73,7 +73,7 @@
m_type = 1
if ("deathgasp","deathgasps")
- message = "[src] seizes up and falls limp, its eyes dead and lifeless..."
+ message = "[src] seizes up and falls limp, [p_their()] eyes dead and lifeless..."
m_type = 1
if ("drool","drools")
@@ -89,7 +89,7 @@
if ("flap","flaps")
if (!src.restrained())
- message = "[src] flaps its wings."
+ message = "[src] flaps [p_their()] wings."
m_type = 2
if ("flip","flips")
@@ -212,7 +212,7 @@
if ("pout","pouts")
message = "[src] pouts."
m_type = 2
-
+
if ("scream","screams")
message = "[src] screams!"
m_type = 2
@@ -222,7 +222,7 @@
m_type = 1
if ("shake","shakes")
- message = "[src] shakes its head."
+ message = "[src] shakes [p_their()] head."
m_type = 1
if ("sigh","sighs")
@@ -268,7 +268,7 @@
message = "[src] stares."
if ("stretch","stretches")
- message = "[src] stretches their arms."
+ message = "[src] stretches [p_their()] arms."
m_type = 2
if ("sulk","sulks")
@@ -276,20 +276,12 @@
m_type = 1
if ("surrender","surrenders")
- message = "[src] puts their hands on their head and falls to the ground, they surrender!"
+ message = "[src] puts [p_their()] hands on [p_their()] head and falls to the ground, [p_they()] surrender[p_s()]!"
if(sleeping)
return //Can't surrender while asleep.
Weaken(20) //So you can't resist.
m_type = 1
- if ("faint","faints")
- message = "[src] faints."
- if(sleeping)
- return //Can't faint while asleep
- SetSleeping(10) //Short-short nap
- m_type = 1
-
-
if ("sway","sways")
message = "[src] sways around dizzily."
m_type = 1
@@ -339,7 +331,7 @@
// Maybe some people are okay with that.
for(var/mob/M in dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
+ if(!M.client || isnewplayer(M))
continue //skip monkeys, leavers and new players
var/T = get_turf(src)
if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T,null)))
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 74a24079251..9c97338acf2 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -27,8 +27,6 @@
med_hud_set_status()
/mob/living/Destroy()
- ..()
-
if(buckled)
buckled.unbuckle_mob(src,force=1)
@@ -39,6 +37,8 @@
qdel(I)
staticOverlays.len = 0
remove_from_all_data_huds()
+ ..()
+
return QDEL_HINT_HARDDEL
@@ -244,8 +244,6 @@
temperature -= change
if(actual < desired)
temperature = desired
-// if(istype(src, /mob/living/carbon/human))
-// world << "[src] ~ [src.bodytemperature] ~ [temperature]"
return temperature
@@ -434,7 +432,7 @@
/mob/living/movement_delay()
. = ..()
- if(istype(loc, /turf/open))
+ if(isopenturf(loc))
var/turf/open/T = loc
. += T.slowdown
switch(m_intent)
@@ -741,7 +739,7 @@
else if(istype(loc, /obj/structure/transit_tube_pod))
loc_temp = environment.temperature
- else if(istype(get_turf(src), /turf/open/space))
+ else if(isspaceturf(get_turf(src)))
var/turf/heat_turf = get_turf(src)
loc_temp = heat_turf.temperature
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index ee4bd6ce206..27d465da4ce 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -81,7 +81,7 @@
visible_message("[src] has been hit by [I].", \
"[src] has been hit by [I].")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration)
- apply_damage(I.throwforce, dtype, zone, armor, I)
+ apply_damage(I.throwforce, dtype, zone, armor)
if(I.thrownby)
add_logs(I.thrownby, src, "hit", I)
else
@@ -208,7 +208,7 @@
M << "You cannot attack people before the game has started."
return 0
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(isturf(loc) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return 0
@@ -252,7 +252,7 @@
M << "You cannot attack people before the game has started."
return 0
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(isturf(loc) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return 0
@@ -276,8 +276,9 @@
//Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs.
-/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
- take_bodypart_damage(min(10*toxpwr, acid_volume * toxpwr))
+/mob/living/acid_act(acidpwr, acid_volume)
+ take_bodypart_damage(acidpwr * min(1, acid_volume * 0.1))
+ return 1
/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0)
@@ -336,3 +337,7 @@
//called when the mob receives a loud bang
/mob/living/proc/soundbang_act()
return 0
+
+//to damage the clothes worn by a mob
+/mob/living/proc/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
+ return
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 0dafbfe1137..d33be72052d 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -71,5 +71,5 @@
var/blood_volume = 0 //how much blood the mob has
var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
-
+
var/slipping = FALSE
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 0114c3dc9fa..8e3fc4a8fff 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -110,7 +110,7 @@ var/list/ai_list = list()
radio = new /obj/item/device/radio/headset/ai(src)
aicamera = new/obj/item/device/camera/siliconcam/ai_camera(src)
- if (istype(loc, /turf))
+ if(isturf(loc))
verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
/mob/living/silicon/ai/proc/toggle_camera_light, /mob/living/silicon/ai/proc/botcall,\
@@ -304,7 +304,7 @@ var/list/ai_list = list()
/mob/living/silicon/ai/proc/ai_call_shuttle()
if(stat == DEAD)
return //won't work if dead
- if(istype(usr,/mob/living/silicon/ai))
+ if(isAI(usr))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
usr << "Wireless control is disabled!"
@@ -343,7 +343,7 @@ var/list/ai_list = list()
set category = "Malfunction"
if(stat == DEAD)
return //won't work if dead
- if(istype(usr,/mob/living/silicon/ai))
+ if(isAI(usr))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
src << "Wireless control is disabled!"
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 116fa63d716..e80591bfadb 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -42,7 +42,7 @@
return ..()
/atom/proc/move_camera_by_click()
- if(istype(usr, /mob/living/silicon/ai))
+ if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
if(AI.eyeobj && AI.client.eye == AI.eyeobj)
AI.cameraFollow = null
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index c4a68499d21..ccc15b42069 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -47,7 +47,7 @@
/mob/living/silicon/ai/proc/lacks_power()
var/turf/T = get_turf(src)
var/area/A = get_area(src)
- return !T || !A || ((!A.master.power_equip || istype(T, /turf/open/space)) && !is_type_in_list(src.loc, list(/obj/item, /obj/mecha)))
+ return !T || !A || ((!A.master.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
@@ -88,7 +88,7 @@
var/turf/T = get_turf(src)
var/area/AIarea = get_area(src)
if(AIarea && AIarea.master.power_equip)
- if(!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
ai_restore_power()
return
src << "Fault confirmed: missing external power. Shutting down main control system to save power."
@@ -96,7 +96,7 @@
src << "Emergency control system online. Verifying connection to power network."
sleep(50)
T = get_turf(src)
- if (istype(T, /turf/open/space))
+ if(isspaceturf(T))
src << "Unable to verify! No power connection detected!"
aiRestorePowerRoutine = POWER_RESTORATION_SEARCH_APC
return
@@ -123,7 +123,7 @@
aiRestorePowerRoutine = POWER_RESTORATION_SEARCH_APC
return
if(AIarea.master.power_equip)
- if (!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
ai_restore_power()
return
switch(PRP)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 7ccef7e871b..9b6704bfcf9 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -195,7 +195,7 @@
if(href_list["getdna"])
var/mob/living/M = card.loc
var/count = 0
- while(!istype(M, /mob/living))
+ while(!isliving(M))
if(!M || !M.loc) return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
M = M.loc
count++
@@ -497,9 +497,9 @@
Host Bioscan
"}
var/mob/living/M = card.loc
- if(!istype(M, /mob/living))
- while (!istype(M, /mob/living))
- if(istype(M, /turf))
+ if(!isliving(M))
+ while(!isliving(M))
+ if(isturf(M))
src.temp = "Error: No biological host found. "
src.subscreen = 0
return dat
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 5b3b3ee6e2e..f968118a12b 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -608,12 +608,12 @@
//check if it doesn't require any access at all
if(check_access(null))
return 1
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_held_item()) || check_access(H.wear_id))
return 1
- else if(istype(M, /mob/living/carbon/monkey))
+ else if(ismonkey(M))
var/mob/living/carbon/monkey/george = M
//they can only hold things :(
if(istype(george.get_active_held_item(), /obj/item))
@@ -706,7 +706,7 @@
else if(istype(A, /obj/item))
var/obj/item/cleaned_item = A
cleaned_item.clean_blood()
- else if(istype(A, /mob/living/carbon/human))
+ else if(ishuman(A))
var/mob/living/carbon/human/cleaned_human = A
if(cleaned_human.lying)
if(cleaned_human.head)
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index a56ef87aedc..120e1fac7d6 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -46,7 +46,7 @@
/mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user)
add_fingerprint(user)
- if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
+ if(opened && !wiresexposed && !issilicon(user))
if(cell)
cell.updateicon()
cell.add_fingerprint(user)
@@ -166,17 +166,16 @@
gib()
return
if(2)
- if (stat != 2)
+ if (stat != DEAD)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3)
- if (stat != 2)
+ if (stat != DEAD)
adjustBruteLoss(30)
- return
-
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
updatehealth()
- if(prob(75) && Proj.damage > 0) spark_system.start()
+ if(prob(75) && Proj.damage > 0)
+ spark_system.start()
return 2
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 3a50f6cb7e5..67872852f92 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -5,14 +5,14 @@
/mob/living/proc/robot_talk(message)
log_say("[key_name(src)] : [message]")
var/desig = "Default Cyborg" //ezmode for taters
- if(istype(src, /mob/living/silicon))
+ if(issilicon(src))
var/mob/living/silicon/S = src
desig = trim_left(S.designation + " " + S.job)
var/message_a = say_quote(message, get_spans())
var/rendered = "Robotic Talk, [name] [message_a]"
for(var/mob/M in player_list)
if(M.binarycheck())
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]"
M << renderedAI
else
@@ -21,7 +21,7 @@
var/following = src
// If the AI talks on binary chat, we still want to follow
// it's camera eye, like if it talked on the radio
- if(istype(src, /mob/living/silicon/ai))
+ if(isAI(src))
var/mob/living/silicon/ai/ai = src
following = ai.eyeobj
var/link = FOLLOW_LINK(M, following)
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index b216c04e1ab..34b0e954c8a 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -48,7 +48,7 @@
if(L.a_intent == "help")
visible_message("[L.name] rubs its head against [src].")
-/mob/living/silicon/attack_hulk(mob/living/carbon/human/user)
+/mob/living/silicon/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(rand(10, 15))
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 0b36b950653..9478bdd60e0 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -21,6 +21,15 @@
updatehealth()
return 1
+/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ if(user.a_intent == "harm")
+ ..(user, 1)
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[user] has punched [src]!", \
+ "[user] has punched [src]!")
+ adjustBruteLoss(15)
+ return 1
+
/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M)
if(..()) //successful monkey bite.
if(stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index d3cc4116ffb..5757267f06f 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -98,7 +98,7 @@
return
if(emagged == 2) //Emag functions
- if(istype(loc, /turf/open))
+ if(isopenturf(loc))
for(var/mob/living/carbon/victim in loc)
if(victim != target)
@@ -170,7 +170,7 @@
/obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/robot_debris,
/obj/effect/decal/cleanable/crayon,
- /obj/effect/decal/cleanable/molten_item,
+ /obj/effect/decal/cleanable/molten_object,
/obj/effect/decal/cleanable/tomato_smudge,
/obj/effect/decal/cleanable/egg_smudge,
/obj/effect/decal/cleanable/pie_smudge,
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index fa4e69cf5ee..7d38d0c7792 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -8,7 +8,7 @@
health = 100
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
-
+ obj_damage = 60
environment_smash = 2 //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
@@ -126,7 +126,7 @@ Auto Patrol[]"},
return dat
/mob/living/simple_animal/bot/ed209/Topic(href, href_list)
- if(lasercolor && (istype(usr,/mob/living/carbon/human)))
+ if(lasercolor && ishuman(usr))
var/mob/living/carbon/human/H = usr
if((lasercolor == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))//Opposing team cannot operate it
return
@@ -418,19 +418,15 @@ Auto Patrol[]"},
return
lastfired = world.time
var/turf/T = loc
- var/atom/U = (istype(target, /atom/movable) ? target.loc : target)
- if((!( U ) || !( T )))
+ var/turf/U = get_turf(target)
+ if(!U)
return
- while(!(istype(U, /turf)))
- U = U.loc
- if(!(istype(T, /turf)))
+ if(!isturf(T))
return
if(!projectile)
return
- if(!(istype(U, /turf)))
- return
var/obj/item/projectile/A = new projectile (loc)
playsound(loc, shoot_sound, 50, 1)
A.current = U
@@ -528,16 +524,12 @@ Auto Patrol[]"},
spawn(2)
icon_state = "[lasercolor]ed209[on]"
var/threat = 5
- if(istype(C, /mob/living/carbon/human))
- C.stuttering = 5
- C.Stun(5)
- C.Weaken(5)
+ C.Weaken(5)
+ C.Stun(5)
+ C.stuttering = 5
+ if(ishuman(C))
var/mob/living/carbon/human/H = C
threat = H.assess_threat(src)
- else
- C.Weaken(5)
- C.stuttering = 5
- C.Stun(5)
add_logs(src,C,"stunned")
if(declare_arrests)
var/area/location = get_area(src)
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 1d276b2bf3b..237e29b5145 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -187,10 +187,10 @@
if(!target && emagged < 2)
if(targetdirection != null) //The bot is in line mode.
var/turf/T = get_step(src, targetdirection)
- if(istype(T, /turf/open/space)) //Check for space
+ if(isspaceturf(T)) //Check for space
target = T
process_type = LINE_SPACE_MODE
- if(istype(T, /turf/open/floor)) //Check for floor
+ if(isfloorturf(T)) //Check for floor
target = T
if(!target)
@@ -225,7 +225,7 @@
if(target)
if(path.len == 0)
- if(!istype(target, /turf/))
+ if(!isturf(target))
var/turf/TL = get_turf(target)
path = get_path_to(src, TL, /turf/proc/Distance_cardinal, 0, 30, id=access_card,simulated_only = 0)
else
@@ -248,9 +248,9 @@
target = null
path = list()
return
- if(istype(target, /turf/) && emagged < 2)
+ if(isturf(target) && emagged < 2)
repair(target)
- else if(emagged == 2 && istype(target,/turf/open/floor))
+ else if(emagged == 2 && isfloorturf(target))
var/turf/open/floor/F = target
anchored = 1
mode = BOT_REPAIRING
@@ -291,7 +291,7 @@
result = F
if(REPLACE_TILE)
F = scan_target
- if(istype(F, /turf/open/floor) && !istype(F, /turf/open/floor/plating)) //The floor must already have a tile.
+ if(isfloorturf(F) && !istype(F, /turf/open/floor/plating)) //The floor must already have a tile.
result = F
if(FIX_TILE) //Selects only damaged floors.
F = scan_target
@@ -307,14 +307,14 @@
/mob/living/simple_animal/bot/floorbot/proc/repair(turf/target_turf)
- if(istype(target_turf, /turf/open/space/))
+ if(isspaceturf(target_turf))
//Must be a hull breach or in line mode to continue.
if(!is_hull_breach(target_turf) && !targetdirection)
target = null
return
- else if(!istype(target_turf, /turf/open/floor))
+ else if(!isfloorturf(target_turf))
return
- if(istype(target_turf, /turf/open/space/)) //If we are fixing an area not part of pure space, it is
+ if(isspaceturf(target_turf)) //If we are fixing an area not part of pure space, it is
anchored = 1
icon_state = "floorbot-c"
visible_message("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ")
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 2d82b9e4a53..4c11c6d04d3 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -157,10 +157,10 @@ var/global/mulebot_count = 0
wires.cut_random()
/mob/living/simple_animal/bot/mulebot/interact(mob/user)
- if(open && !istype(user, /mob/living/silicon/ai))
+ if(open && !isAI(user))
wires.interact(user)
else
- if(wires.is_cut(WIRE_RX) && istype(user, /mob/living/silicon/ai))
+ if(wires.is_cut(WIRE_RX) && isAI(user))
return
ui_interact(user)
@@ -474,7 +474,7 @@ var/global/mulebot_count = 0
if(next == loc)
path -= next
return
- if(istype( next, /turf))
+ if(isturf(next))
//world << "at ([x],[y]) moving to ([next.x],[next.y])"
if(bloodiness)
@@ -636,7 +636,7 @@ var/global/mulebot_count = 0
if(wires.is_cut(WIRE_AVOIDANCE)) // usually just bumps, but if avoidance disabled knock over mobs
var/mob/M = obs
if(ismob(M))
- if(istype(M,/mob/living/silicon/robot))
+ if(iscyborg(M))
visible_message("[src] bumps into [M]!")
else
if(!paicard)
@@ -738,7 +738,7 @@ var/global/mulebot_count = 0
unload(get_dir(loc, A))
else
..()
-
+
/mob/living/simple_animal/bot/mulebot/insertpai(mob/user, obj/item/device/paicard/card)
if(..())
visible_message("[src] safeties are locked on.")
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 69be54689f6..9a709560132 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -189,7 +189,7 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
if(istype(AM, /obj/item))
var/obj/item/I = AM
- if(I.throwforce < src.health && I.thrownby && (istype(I.thrownby, /mob/living/carbon/human)))
+ if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
var/mob/living/carbon/human/H = I.thrownby
retaliate(H)
..()
@@ -215,7 +215,7 @@ Auto Patrol: []"},
spawn(2)
icon_state = "secbot[on]"
var/threat = 5
- if(istype(C, /mob/living/carbon/human))
+ if(ishuman(C))
C.stuttering = 5
C.Stun(5)
C.Weaken(5)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 4893c83ed86..31fb79e5cc9 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -38,16 +38,16 @@
AddSpell(new spell(null))
/mob/living/simple_animal/hostile/construct/examine(mob/user)
- var/t_He = they_pronoun(TRUE)
- var/plurality = (gender == PLURAL)
+ var/t_He = p_they(TRUE)
+ var/t_s = p_s()
var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
msg += "[desc]\n"
if(health < maxHealth)
msg += ""
- if (src.health >= src.maxHealth/2)
- msg += "[t_He] look[plurality ? "":"s"] slightly dented.\n"
+ if(health >= maxHealth/2)
+ msg += "[t_He] look[t_s] slightly dented.\n"
else
- msg += "[t_He] look[plurality ? "":"s"] severely dented!\n"
+ msg += "[t_He] look[t_s] severely dented!\n"
msg += ""
msg += "*---------*"
@@ -62,11 +62,11 @@
M.visible_message("[M] repairs some of \the [src]'s dents.", \
"You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health.")
else
- M.visible_message("[M] repairs some of [their_pronoun()] own dents.", \
+ M.visible_message("[M] repairs some of [p_their()] own dents.", \
"You repair some of your own dents, leaving you at [M.health]/[M.maxHealth] health.")
else
if(src != M)
- M << "You cannot repair [src]'s dents, as [they_pronoun()] [get_has()] none!"
+ M << "You cannot repair [src]'s dents, as [p_they()] [p_have()] none!"
else
M << "You cannot repair your own dents, as you have none!"
else if(src != M)
@@ -91,6 +91,7 @@
health = 250
response_harm = "harmlessly punches"
harm_intent_damage = 0
+ obj_damage = 90
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "smashes their armored gauntlet into"
@@ -169,6 +170,7 @@
health = 50
response_harm = "viciously beats"
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 5
melee_damage_upper = 5
retreat_distance = 10
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 40bda94fb41..e3f251bf219 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -113,7 +113,7 @@
//Removing from inventory
if(href_list["remove_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
@@ -140,7 +140,7 @@
//Adding things to inventory
else if(href_list["add_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)))
return
var/add_to = href_list["add_inv"]
@@ -282,22 +282,26 @@
var/saved_head //path
/mob/living/simple_animal/pet/dog/corgi/Ian/New()
+ ..()
+ //parent call must happen first to ensure IAN
+ //is not in nullspace when child puppies spawn
Read_Memory()
if(age == 0)
- var/mob/living/simple_animal/pet/dog/corgi/puppy/P = new /mob/living/simple_animal/pet/dog/corgi/puppy(loc)
- P.name = "Ian"
- P.real_name = "Ian"
- P.gender = MALE
- P.desc = "It's the HoP's beloved corgi puppy."
- Write_Memory(0)
- qdel(src)
+ var/turf/target = get_turf(loc)
+ if(target)
+ var/mob/living/simple_animal/pet/dog/corgi/puppy/P = new /mob/living/simple_animal/pet/dog/corgi/puppy(target)
+ P.name = "Ian"
+ P.real_name = "Ian"
+ P.gender = MALE
+ P.desc = "It's the HoP's beloved corgi puppy."
+ Write_Memory(0)
+ qdel(src)
else if(age == record_age)
icon_state = "old_corgi"
icon_living = "old_corgi"
icon_dead = "old_corgi_dead"
desc = "At a ripe old age of [record_age] Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
turns_per_move = 20
- ..()
/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
if(ticker.current_state == GAME_STATE_FINISHED && !memory_saved)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
index 3841616201e..077265552de 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
@@ -55,7 +55,7 @@
if(!drone)
return
- if(istype(loc, /mob/living))
+ if(isliving(loc))
var/mob/living/L = loc
L << "[drone] is trying to escape!"
if(!do_after(drone, 50, target = L))
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index c2c6563c926..49a4f2bb93e 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -84,7 +84,7 @@
user << "You start to tighten loose screws on [src]..."
if(do_after(user,80/I.toolspeed,target=user))
adjustBruteLoss(-getBruteLoss())
- visible_message("[user] tightens [src == user ? "[user.their_pronoun()]" : "[src]'s"] loose screws!", "You tighten [src == user ? "your" : "[src]'s"] loose screws.")
+ visible_message("[user] tightens [src == user ? "[user.p_their()]" : "[src]'s"] loose screws!", "You tighten [src == user ? "your" : "[src]'s"] loose screws.")
else
user << "You need to remain still to tighten [src]'s screws!"
else
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index e36c96c79f5..e2a2c7ffc89 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -50,8 +50,8 @@
src.visible_message("[src] calms down.")
if(stat == CONSCIOUS)
udder.generateMilk()
- if(locate(/obj/structure/spacevine) in loc)
- var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ if(SV)
SV.eat(src)
if(!pulledby)
for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
@@ -67,8 +67,8 @@
/mob/living/simple_animal/hostile/retaliate/goat/Move()
..()
if(!stat)
- if(locate(/obj/structure/spacevine) in loc)
- var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ if(SV)
SV.eat(src)
/mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 4fdcf0610a1..98cc9b3d535 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -20,6 +20,7 @@
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = 2
+ obj_damage = 0
environment_smash = 0
var/list/edibles = list(/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cockroach) //list of atoms, however turfs won't affect AI, but will affect consumption.
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 1a52e018bae..79281886fd6 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -69,10 +69,10 @@
if(C.avail())
visible_message("[src] chews through the [C]. It's toast!")
playsound(src, 'sound/effects/sparks2.ogg', 100, 1)
- C.Deconstruct()
+ C.deconstruct()
death(toast=1)
else
- C.Deconstruct()
+ C.deconstruct()
visible_message("[src] chews through the [C].")
/*
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 407076bbd4c..d77708e0b2a 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -32,6 +32,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
healable = FALSE //don't brusepack the guardian
damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner
environment_smash = 1
+ obj_damage = 40
melee_damage_lower = 15
melee_damage_upper = 15
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index d54d5013690..ff2e1c5a6aa 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -51,6 +51,7 @@
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
armour_penetration = initial(armour_penetration)
+ obj_damage = initial(obj_damage)
environment_smash = initial(environment_smash)
alpha = initial(alpha)
if(!forced)
@@ -68,6 +69,7 @@
melee_damage_lower = 50
melee_damage_upper = 50
armour_penetration = 100
+ obj_damage = 0
environment_smash = 0
PoolOrNew(/obj/effect/overlay/temp/guardian/phase/out, get_turf(src))
alpha = 15
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index 3d4b665fa81..842bc5e7200 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -33,6 +33,7 @@
ranged = initial(ranged)
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
+ obj_damage = initial(obj_damage)
environment_smash = initial(environment_smash)
alpha = 255
range = initial(range)
@@ -43,6 +44,7 @@
ranged = 0
melee_damage_lower = 0
melee_damage_upper = 0
+ obj_damage = 0
environment_smash = 0
alpha = 45
range = 255
diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
index 4cff9a0604b..45624bbaaa2 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
@@ -2,6 +2,7 @@
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 20
melee_damage_upper = 20
+ obj_damage = 80
next_move_modifier = 0.8 //attacks 20% faster
environment_smash = 2
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index a7a204af676..041116b0a39 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -76,7 +76,7 @@
return
var/turf/beacon_loc = get_turf(src.loc)
- if(!istype(beacon_loc, /turf/open/floor))
+ if(!isfloorturf(beacon_loc))
return
if(beacon)
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 76153092641..32c330d2cd5 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -16,6 +16,7 @@
maxHealth = 125
health = 125
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashes"
@@ -108,7 +109,7 @@
LayEggs()
/mob/living/simple_animal/hostile/alien/proc/SpreadPlants()
- if(!isturf(loc) || istype(loc, /turf/open/space))
+ if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
return
@@ -116,7 +117,7 @@
new /obj/structure/alien/weeds/node(loc)
/mob/living/simple_animal/hostile/alien/proc/LayEggs()
- if(!isturf(loc) || istype(loc, /turf/open/space))
+ if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/egg) in get_turf(src))
return
@@ -156,6 +157,7 @@
melee_damage_upper = 0
a_intent = "help"
friendly = "caresses"
+ obj_damage = 0
environment_smash = 0
gold_core_spawnable = 1
icon_state = "maid"
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index ce7c655206d..6984d60af32 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -22,6 +22,7 @@
health = 60
var/armored = FALSE
+ obj_damage = 60
melee_damage_lower = 20
melee_damage_upper = 30
attacktext = "claws"
@@ -94,7 +95,7 @@
A.melee_damage_lower += 5
A.melee_damage_upper += 5
A.update_icons()
- user << "You strap the armor plating to [A] and sharpen [A.their_pronoun()] claws with the nail filer. This was a great idea."
+ user << "You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea."
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 0ec1db86273..0ec5aebdef5 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -30,6 +30,7 @@
health = 10
faction = list("hostile")
move_to_delay = 0
+ obj_damage = 0
environment_smash = 0
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
@@ -145,8 +146,9 @@
else
if(beegent && isliving(target))
var/mob/living/L = target
- beegent.reaction_mob(L, INJECT)
- L.reagents.add_reagent(beegent.id, rand(1,5))
+ if(L.reagents)
+ beegent.reaction_mob(L, INJECT)
+ L.reagents.add_reagent(beegent.id, rand(1,5))
target.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 356d4bafbef..e6b80ad893b 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -10,6 +10,7 @@
environment_smash = 0
minimum_distance = 3
retreat_distance = 3
+ obj_damage = 0
melee_damage_lower = 10
melee_damage_upper = 20
health = 1000
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index c5d197084e6..bf99d02e8a4 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -18,6 +18,7 @@
health = 25
harm_intent_damage = 8
+ obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites"
@@ -63,6 +64,7 @@
pixel_x = -16
mob_size = MOB_SIZE_LARGE
+ obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm
index 32d5b7c73dc..566f1266adf 100644
--- a/code/modules/mob/living/simple_animal/hostile/creature.dm
+++ b/code/modules/mob/living/simple_animal/hostile/creature.dm
@@ -7,6 +7,7 @@
icon_dead = "otherthing-dead"
health = 80
maxHealth = 80
+ obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 50
attacktext = "chomps"
diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
index 9781dcd05a4..07aeea0a523 100644
--- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
@@ -17,6 +17,7 @@
speak_emote = list("telepathically cries")
harm_intent_damage = 15
+ obj_damage = 60
melee_damage_lower = 20
melee_damage_upper = 25
attacktext = "blinks at"
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 6dba4c84856..b9f7b834f98 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -19,6 +19,7 @@
robust_searching = 1
harm_intent_damage = 10
+ obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "grips"
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 2e79f072bf6..52285f23a68 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -35,6 +35,7 @@
response_harm = "hits"
maxHealth = 200
health = 200
+ obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
faction = list("spiders")
@@ -84,9 +85,8 @@
health = 40
melee_damage_lower = 5
melee_damage_upper = 10
- poison_per_bite = 10
+ poison_per_bite = 3
var/atom/cocoon_target
- poison_type = "morphine"
var/fed = 0
//hunters have the most poison and move the fastest, so they can find prey
@@ -214,7 +214,7 @@
walk(src,0)
if(do_after(src, 50, target = src))
if(busy == SPINNING_COCOON)
- if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
+ if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1)
var/obj/structure/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index f1bf3e339dc..cf528306b21 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -16,6 +16,7 @@
faction = list("creature")
robust_searching = 1
stat_attack = 2
+ obj_damage = 0
environment_smash = 0
speak_emote = list("squeaks")
ventcrawler = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index f5c9269c0d9..d4b62f616ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile
faction = list("hostile")
stop_automated_movement_when_pulled = 0
+ obj_damage = 40
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
var/ranged = 0
@@ -352,7 +353,7 @@
EscapeConfinement()
for(var/dir in cardinal)
var/turf/T = get_step(targets_from, dir)
- if(istype(T, /turf/closed/wall) || istype(T, /turf/closed/mineral))
+ if(iswallturf(T) || ismineralturf(T))
if(T.Adjacent(targets_from))
T.attack_animal(src)
for(var/a in T)
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index 7c556ff897c..fdde147b9ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -49,7 +49,7 @@
/mob/living/simple_animal/hostile/illusion/AttackingTarget()
..()
- if(istype(target, /mob/living) && prob(multiply_chance))
+ if(isliving(target) && prob(multiply_chance))
var/mob/living/L = target
if(L.stat == DEAD)
return
@@ -66,6 +66,7 @@
melee_damage_lower = 0
melee_damage_upper = 0
speed = -1
+ obj_damage = 0
environment_smash = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index 63d3bd82565..46c3a62aca8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -122,7 +122,7 @@
return 0
if(!M.has_charge(required_mecha_charge))
return 0
- if(M.health < (initial(M.health)*0.5))
+ if(M.obj_integrity < M.max_integrity*0.5)
return 0
return 1
@@ -216,7 +216,7 @@
return
//Too Much Damage - Eject
- if(mecha.health < initial(mecha.health)*0.1)
+ if(mecha.obj_integrity < mecha.max_integrity*0.1)
exit_mecha(mecha)
return
@@ -226,7 +226,7 @@
mecha.smoke_action.Activate()
//Heavy damage - Defence Power or Retreat
- if(mecha.health < initial(mecha.health)*0.25)
+ if(mecha.obj_integrity < mecha.max_integrity*0.25)
if(prob(defence_mode_chance))
if(mecha.defense_action && mecha.defense_action.owner && !mecha.defence_mode)
mecha.leg_overload_mode = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 83354cdfe63..24a2ef5c935 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -496,7 +496,7 @@ Difficulty: Very Hard
for(var/atom/Stuff in A)
if(isturf(Stuff))
var/turf/T = Stuff
- if((istype(T, /turf/open/space) || istype(T, /turf/open/floor)) && NewTerrainFloors)
+ if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
var/turf/open/O = T.ChangeTurf(NewTerrainFloors)
if(O.air)
var/datum/gas_mixture/G = O.air
@@ -505,7 +505,7 @@ Difficulty: Very Hard
var/atom/Picked = pick(NewFlora)
new Picked(O)
continue
- if(istype(T, /turf/closed/wall) && NewTerrainWalls)
+ if(iswallturf(T) && NewTerrainWalls)
T.ChangeTurf(NewTerrainWalls)
continue
if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs)
@@ -625,6 +625,7 @@ Difficulty: Very Hard
flying = 1
minbodytemp = 0
maxbodytemp = 1500
+ obj_damage = 0
environment_smash = 0
AIStatus = AI_OFF
stop_automated_movement = 1
@@ -699,7 +700,7 @@ Difficulty: Very Hard
icon_state = null //This shouldn't even be visible, so if it DOES show up, at least nobody will notice
density = 1
anchored = 1
- health = 999
+ obj_integrity = 999
var/mob/living/simple_animal/holder_animal
/obj/structure/closet/stasis/process()
@@ -759,7 +760,7 @@ Difficulty: Very Hard
sound = null
/obj/effect/proc_holder/spell/targeted/exit_possession/cast(list/targets, mob/user = usr)
- if(!istype(user.loc, /turf/open/floor))
+ if(!isfloorturf(user.loc))
return
var/datum/mind/target_mind = user.mind
for(var/i in user)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index cfeb0a19e9d..2d40aae0cd2 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -262,6 +262,7 @@ Difficulty: Medium
maxHealth = 300
health = 300
faction = list("neutral")
+ obj_damage = 80
melee_damage_upper = 30
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 37aa5575a9b..9d5c97f4831 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -492,7 +492,7 @@ Difficulty: Hard
friendly_fire_check = friendly_fire
if(new_caster)
hit_things += new_caster
- if(istype(loc, /turf/closed/mineral)) //drill mineral turfs
+ if(ismineralturf(loc)) //drill mineral turfs
var/turf/closed/mineral/M = loc
M.gets_drilled(caster)
addtimer(src, "blast", 0)
@@ -535,7 +535,7 @@ Difficulty: Hard
continue
M.occupant << "Your [M.name] is struck by a [name]!"
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
- M.take_damage(damage, "fire", 0)
+ M.take_damage(damage, BURN, 0, 0)
/obj/effect/hierophant
name = "hierophant rune"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 8ef9ee4a1ee..f05445085d6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -9,7 +9,7 @@
a_intent = "harm"
sentience_type = SENTIENCE_BOSS
environment_smash = 3
- obj_damage = 75
+ obj_damage = 400
luminosity = 3
faction = list("mining", "boss")
weather_immunities = list("lava","ash")
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 1c0e9180207..e2d3afd545a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -199,7 +199,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/machine/CanAttack(atom/the_target)
if(the_target == creator) // Don't attack our creator AI.
return 0
- if(isrobot(the_target))
+ if(iscyborg(the_target))
var/mob/living/silicon/robot/R = the_target
if(R.connected_ai == creator) // Only attack robots that aren't synced to our creator AI.
return 0
@@ -216,6 +216,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged/CopyObject(obj/O, mob/living/creator, destroy_original = 0)
if(..())
emote_see = list("aims menacingly")
+ obj_damage = 0
environment_smash = 0 //needed? seems weird for them to do so
ranged = 1
retreat_distance = 1 //just enough to shoot
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index de6056ca76e..b7ab39772ed 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -3,6 +3,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("mining")
weather_immunities = list("lava","ash")
+ obj_damage = 30
environment_smash = 2
minbodytemp = 0
maxbodytemp = INFINITY
@@ -69,6 +70,7 @@
maxHealth = 200
health = 200
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 12
melee_damage_upper = 12
attacktext = "bites into"
@@ -210,6 +212,7 @@
throw_message = "falls right through the strange body of the"
ranged_cooldown = 0
ranged_cooldown_time = 20
+ obj_damage = 0
environment_smash = 0
retreat_distance = 3
minimum_distance = 3
@@ -291,7 +294,7 @@
user << "[src] are useless on the dead."
return
if(H != user)
- H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!")
+ H.visible_message("[user] forces [H] to apply [src]... [H.p_they()] quickly regenerate all injuries!")
feedback_add_details("hivelord_core","[src.type]|used|other")
else
user << "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments."
@@ -327,6 +330,7 @@
speak_emote = list("telepathically cries")
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "falls right through the strange body of the"
+ obj_damage = 0
environment_smash = 0
pass_flags = PASSTABLE
del_on_death = 1
@@ -420,6 +424,7 @@
maxHealth = 300
health = 300
harm_intent_damage = 0
+ obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "pulverizes"
@@ -454,7 +459,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
var/tturf = get_turf(target)
- if(!(istype(tturf, /turf)))
+ if(!isturf(tturf))
return
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
visible_message("The [src.name] digs its tentacles under [target.name]!")
@@ -483,7 +488,7 @@
/obj/effect/goliath_tentacle/New()
var/turftype = get_turf(src)
- if(istype(turftype, /turf/closed/mineral))
+ if(ismineralturf(turftype))
var/turf/closed/mineral/M = turftype
M.gets_drilled()
addtimer(src, "Trip", 10)
@@ -537,13 +542,11 @@
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/D = target
- var/list/damage_absorption = D.damage_absorption
if(D.hides < 3)
D.hides++
- damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
- damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05
- damage_absorption["fire"] = damage_absorption["fire"] - 0.05
- damage_absorption["laser"] = damage_absorption["laser"] - 0.025
+ D.armor["melee"] = max(D.armor["melee"] - 0.1, 0.3)
+ D.armor["bullet"] = D.armor["bullet"] - 0.05
+ D.armor["laser"] = D.armor["laser"] - 0.025
user << "You strengthen [target], improving its resistance against melee attacks."
D.update_icon()
if(D.hides == 3)
@@ -581,6 +584,7 @@
maxHealth = 50
health = 50
harm_intent_damage = 5
+ obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "chomps"
@@ -625,6 +629,7 @@
return
wumbo = 1
icon_state = "Fugu_big"
+ obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
harm_intent_damage = 0
@@ -643,6 +648,7 @@
walk(src, 0)
wumbo = 0
icon_state = "Fugu"
+ obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
harm_intent_damage = 5
@@ -743,6 +749,7 @@
icon_aggro = "legion"
icon_dead = "legion"
icon_gib = "syndicate_gib"
+ obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "lashes out at"
@@ -861,6 +868,7 @@
density = 0
speak_chance = 1
turns_per_move = 8
+ obj_damage = 0
environment_smash = 0
move_to_delay = 15
response_help = "pets"
@@ -987,7 +995,7 @@
/mob/living/simple_animal/hostile/spawner/lavaland/New()
..()
for(var/F in RANGE_TURFS(1, src))
- if(istype(F, /turf/closed/mineral))
+ if(ismineralturf(F))
var/turf/closed/mineral/M = F
M.ChangeTurf(M.turf_type)
gps = new /obj/item/device/gps/internal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index b0d71991d30..023774cf439 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -13,6 +13,7 @@
response_disarm = "gently pushes aside"
response_harm = "whacks"
harm_intent_damage = 5
+ obj_damage = 0
melee_damage_lower = 1
melee_damage_upper = 1
attack_same = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index 9f12d423d15..b87ace1afad 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -14,6 +14,7 @@
health = 100
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "slashes"
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index b4de57da65e..c28250e3fcc 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -21,6 +21,7 @@
pass_flags = PASSTABLE
faction = list("hostile")
attack_sound = 'sound/weapons/bite.ogg'
+ obj_damage = 0
environment_smash = 0
ventcrawler = 2
mob_size = MOB_SIZE_TINY
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index ae38b62698a..1830ff0cd61 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -22,6 +22,7 @@
melee_damage_upper = 10
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
+ obj_damage = 0
environment_smash = 0
del_on_death = 1
loot = list(/obj/effect/mob_spawn/human/corpse/clown)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
index e1892140a2c..a1257d71e34 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
@@ -19,6 +19,7 @@
melee_damage_upper = 10
attacktext = "hits"
attack_sound = 'sound/weapons/punch1.ogg'
+ obj_damage = 0
environment_smash = 0
del_on_death = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index 4664a41082c..f318f7ae15c 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -22,7 +22,6 @@
attack_sound = 'sound/hallucinations/growl1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
- environment_smash = 1
robust_searching = 1
stat_attack = 1
gold_core_spawnable = 1
@@ -64,6 +63,7 @@
speak_chance = 1
speak = list("THE GODS WILL IT!","DEUS VULT!","REMOVE KABAB!")
force_threshold = 10 //trying to simulate actually having armor
+ obj_damage = 50
melee_damage_lower = 25
melee_damage_upper = 30
deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!"
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 739a332d653..30dbb43e153 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -18,7 +18,8 @@
health = 50000
healable = 0
- harm_intent_damage = 70
+ harm_intent_damage = 10
+ obj_damage = 100
melee_damage_lower = 68
melee_damage_upper = 83
attacktext = "claws"
@@ -207,7 +208,7 @@
/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets,mob/user = usr)
for(var/mob/living/target in targets)
- if(istype(target, /mob/living/carbon/human))
+ if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.dna.species.invis_sight == SEE_INVISIBLE_LIVING)
H.dna.species.invis_sight = SEE_INVISIBLE_NOLIGHTING
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 904f3abcdcf..2f17fa57523 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -18,6 +18,7 @@
maxHealth = 100
health = 100
harm_intent_damage = 5
+ obj_damage = 0
melee_damage_lower = 10
melee_damage_upper = 10
attacktext = "punches"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 9663b70e2f5..b6f99faf0cb 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -136,6 +136,7 @@
/mob/living/simple_animal/hostile/syndicate/civilian
minimum_distance = 10
retreat_distance = 10
+ obj_damage = 0
environment_smash = 0
/mob/living/simple_animal/hostile/syndicate/civilian/Aggro()
@@ -154,6 +155,8 @@
maxHealth = 25
melee_damage_lower = 15
melee_damage_upper = 15
+ obj_damage = 0
+ environment_smash = 0
attacktext = "cuts"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = list("syndicate")
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index e7a4dbb6f82..fb9e9fc3c6f 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -41,7 +41,7 @@
/mob/living/simple_animal/hostile/tree/Life()
..()
- if(istype(src.loc, /turf/open))
+ if(isopenturf(loc))
var/turf/open/T = src.loc
if(T.air && T.air.gases["co2"])
var/co2 = T.air.gases["co2"][MOLES]
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index 14aeb265158..6bc9aa07972 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -55,6 +55,7 @@
maxHealth = 50
ranged = 1
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
a_intent = "harm"
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index ebe6e335255..e1528dea4ef 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -199,7 +199,7 @@
return
//Is the usr's mob type able to do this? (lolaliens)
- if(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))
+ if(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr))
//Removing from inventory
if(href_list["remove_inv"])
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index b66571bdb74..bd06a445cc9 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -31,7 +31,7 @@
del_on_death = 1
/mob/living/simple_animal/shade/death()
- deathmessage = "lets out a contented sigh as [their_pronoun()] form unwinds."
+ deathmessage = "lets out a contented sigh as [p_their()] form unwinds."
..()
/mob/living/simple_animal/shade/canSuicide()
@@ -50,7 +50,7 @@
M.visible_message("[M] heals \the [src].", \
"You heal [src], leaving [src] at [health]/[maxHealth] health.")
else
- M << "You cannot heal [src], as [they_pronoun()] [get_is()] unharmed!"
+ M << "You cannot heal [src], as [p_they()] [p_are()] unharmed!"
else if(src != M)
..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 8de22d32685..5d571abf654 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -199,7 +199,7 @@
//world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]"
bodytemperature += diff
- if(istype(T,/turf/open))
+ if(isopenturf(T))
var/turf/open/ST = T
if(ST.air)
var/ST_gases = ST.air.gases
@@ -372,7 +372,7 @@
else if(!istype(M, childtype) && M.gender == MALE) //Better safe than sorry ;_;
partner = M
- else if(istype(M, /mob/living) && !faction_check(M)) //shyness check. we're not shy in front of things that share a faction with us.
+ else if(isliving(M) && !faction_check(M)) //shyness check. we're not shy in front of things that share a faction with us.
alone = 0
continue
if(alone && partner && children < 3)
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index a4cf1c4a7bb..1aef1490baf 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -63,7 +63,7 @@
break
if(Target in view(1,src))
- if(istype(Target, /mob/living/silicon))
+ if(issilicon(Target))
if(!Atkcool)
Atkcool = 1
spawn(45)
@@ -343,7 +343,7 @@
if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence
targets += L // Possible target found!
- if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
+ if(ishuman(L)) //Ignore slime(wo)men
var/mob/living/carbon/human/H = L
if(src.type in H.dna.species.ignored_by)
continue
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 975438b0a70..ace41147727 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -259,10 +259,11 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
if(..()) //successful larva bite.
attacked += 10
-/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user)
+/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
- adjustBruteLoss(15)
discipline_slime(user)
+ return ..()
+
/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 1b1808518f8..e6a735b39a9 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -418,7 +418,7 @@ var/next_mob_id = 0
if(mind)
mind.show_memory(src)
else
- src << "The game appears to have misplaced your mind datum, so we can't show you your notes."
+ src << "You don't have a mind datum for some reason, so you can't look at your notes, if you had any."
/mob/verb/add_memory(msg as message)
set name = "Add Note"
@@ -430,21 +430,7 @@ var/next_mob_id = 0
if(mind)
mind.store_memory(msg)
else
- src << "The game appears to have misplaced your mind datum, so we can't show you your notes."
-
-/mob/proc/store_memory(msg as message, popup, sane = 1)
- msg = copytext(msg, 1, MAX_MESSAGE_LEN)
-
- if (sane)
- msg = sanitize(msg)
-
- if (length(memory) == 0)
- memory += msg
- else
- memory += " [msg]"
-
- if (popup)
- memory()
+ src << "You don't have a mind datum for some reason, so you can't add a note to it."
/mob/verb/abandon_mob()
set name = "Respawn"
@@ -483,7 +469,7 @@ var/next_mob_id = 0
set name = "Observe"
set category = "OOC"
- if(stat != DEAD || istype(src, /mob/new_player))
+ if(stat != DEAD || isnewplayer(src))
usr << "You must be observing to use this!"
return
@@ -565,7 +551,7 @@ var/next_mob_id = 0
return
if(!Adjacent(usr))
return
- if(istype(M, /mob/living/silicon/ai))
+ if(isAI(M))
return
show_inv(usr)
@@ -628,7 +614,7 @@ var/next_mob_id = 0
var/list/overrides = list()
for(var/image/I in client.images)
if(I.loc && I.loc.loc == listed_turf && I.override)
- overrides = I.loc
+ overrides += I.loc
for(var/atom/A in listed_turf)
if(!A.mouse_opacity)
continue
@@ -714,7 +700,7 @@ var/next_mob_id = 0
layer = initial(layer)
update_transform()
update_action_buttons_icon()
- if(istype(src, /mob/living))
+ if(isliving(src))
var/mob/living/L = src
if(L.has_status_effect(/datum/status_effect/freon))
canmove = 0
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index ee73870dfd0..de84e2491a8 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -29,7 +29,6 @@
var/attack_log = list( )
var/obj/machinery/machine = null
var/other_mobs = null
- var/memory = ""
var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index e59f4708e90..766cc83f1b7 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -318,7 +318,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(hud_used && hud_used.action_intent)
hud_used.action_intent.icon_state = "[a_intent]"
- else if(isrobot(src) || ismonkey(src) || islarva(src))
+ else if(iscyborg(src) || ismonkey(src) || islarva(src))
switch(input)
if("help")
a_intent = "help"
@@ -342,7 +342,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(!istype(M))
return 0
if(issilicon(M))
- if(isrobot(M)) //For cyborgs, returns 1 if the cyborg has a law 0 and special_role. Returns 0 if the borg is merely slaved to an AI traitor.
+ if(iscyborg(M)) //For cyborgs, returns 1 if the cyborg has a law 0 and special_role. Returns 0 if the borg is merely slaved to an AI traitor.
var/mob/living/silicon/robot/R = M
if(R.mind && R.mind.special_role)
if(R.laws && R.laws.zeroth && R.syndicate)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 25df31320da..d52bdf07aa0 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -85,7 +85,7 @@
/client/verb/drop_item()
set hidden = 1
- if(!isrobot(mob))
+ if(!iscyborg(mob))
mob.drop_item_v()
return
@@ -283,7 +283,7 @@
continue
else if(isturf(A))
var/turf/turf = A
- if(istype(turf,/turf/open/space))
+ if(isspaceturf(turf))
continue
if(!turf.density && !mob_negates_gravity())
continue
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index f6b918d2f3a..88dbc1e492b 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -4,8 +4,8 @@
//Note that this proc does NOT do MMI related stuff!
/mob/proc/change_mob_type(new_type = null, turf/location = null, new_name = null as text, delete_old_mob = 0 as num)
- if(istype(src,/mob/new_player))
- usr << "cannot convert players who have not entered yet."
+ if(isnewplayer(src))
+ usr << "Cannot convert players who have not entered yet."
return
if(!new_type)
@@ -18,8 +18,8 @@
usr << "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder."
return
- if( new_type == /mob/new_player )
- usr << "cannot convert into a new_player mob type."
+ if(ispath(new_type, /mob/new_player))
+ usr << "Cannot convert into a new_player mob type."
return
var/mob/M
@@ -50,7 +50,7 @@
client.prefs.copy_to(H)
H.dna.update_dna_identity()
- if(mind && istype(M, /mob/living))
+ if(mind && isliving(M))
mind.transfer_to(M, 1) // second argument to force key move to new mob
else
M.key = key
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index e947d24c1a7..570ceb1e4a6 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -304,7 +304,7 @@
var/mob/living/character = create_character() //creates the human and transfers vars and mind
var/equip = SSjob.EquipRank(character, rank, 1)
- if(isrobot(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob.
+ if(iscyborg(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob.
character = equip
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index e8e09b4943a..69ed544ded5 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -30,12 +30,10 @@
var/max_hardware_size = 0 // Maximal hardware w_class. Tablets/PDAs have 1, laptops 2, consoles 4.
var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
- // Damage of the chassis. If the chassis takes too much damage it will break apart.
- var/damage = 0 // Current damage level
- var/broken_damage = 50 // Damage level at which the computer ceases to operate
- var/max_damage = 100 // Damage level at which the computer breaks apart.
-
+ obj_integrity = 100
+ max_integrity = 100
armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 0, acid = 0)
+
// Important hardware (must be installed for computer to work)
// Optional hardware (improves functionality, but is not critical for computer to work)
@@ -164,9 +162,9 @@
/obj/item/device/modular_computer/examine(mob/user)
..()
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
user << "It is heavily damaged!"
- else if(damage)
+ else if(obj_integrity < max_integrity)
user << "It is damaged."
/obj/item/device/modular_computer/update_icon()
@@ -180,7 +178,7 @@
else
add_overlay(icon_state_menu)
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
add_overlay("bsod")
add_overlay("broken")
@@ -194,7 +192,7 @@
/obj/item/device/modular_computer/proc/turn_on(mob/user)
var/issynth = issilicon(user) // Robots and AIs get different activation messages.
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
if(issynth)
user << "You send an activation signal to \the [src], but it responds with an error code. It must be damaged."
else
@@ -226,7 +224,7 @@
last_power_usage = 0
return 0
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
shutdown_computer()
return 0
@@ -377,13 +375,14 @@
user << "\The [W] is off."
return
- if(!damage)
+ if(obj_integrity == max_integrity)
user << "\The [src] does not require repairs."
return
user << "You begin repairing damage to \the [src]..."
- if(WT.remove_fuel(round(damage/75)) && do_after(usr, damage/10))
- damage = 0
+ var/dmg = round(max_integrity - obj_integrity)
+ if(WT.remove_fuel(round(dmg/75)) && do_after(usr, dmg/10))
+ obj_integrity = max_integrity
user << "You repair \the [src]."
return
diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm
index d27ec0a750f..5e521a04e17 100644
--- a/code/modules/modular_computers/computers/item/computer_damage.dm
+++ b/code/modules/modular_computers/computers/item/computer_damage.dm
@@ -1,49 +1,31 @@
-/obj/item/device/modular_computer/proc/take_damage(amount, component_probability, damage_casing = 1, randomize = 1)
- if(randomize)
- // 75%-125%, rand() works with integers, apparently.
- amount *= (rand(75, 125) / 100.0)
- amount = round(amount)
- if(damage_casing)
- damage += amount
- damage = max(0,min(max_damage,damage))
-
+/obj/item/device/modular_computer/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity))
+ switch(damage_flag)
+ if("bullet")
+ component_probability = damage_amount * 0.5
+ if("laser")
+ component_probability = damage_amount * 0.66
if(component_probability)
for(var/I in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[I]
if(prob(component_probability))
- H.take_damage(round(amount / 2))
+ H.take_damage(round(damage_amount*0.5), damage_type, damage_flag, 0)
- if(damage >= max_damage)
- break_apart()
-// Stronger explosions cause serious damage to internal components
-// Minor explosions are mostly mitigitated by casing.
-/obj/item/device/modular_computer/ex_act(severity)
- take_damage(rand(100,200)/severity, component_probability = 30/severity)
-
-// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components
-/obj/item/device/modular_computer/emp_act(severity)
- take_damage(rand(100,200)/severity, component_probability = 50/severity, damage_casing = 0)
-
-// "Stun" weapons can cause minor damage to components (short-circuits?)
-// "Burn" damage is equally strong against internal components and exterior casing
-// "Brute" damage mostly damages the casing.
-/obj/item/device/modular_computer/bullet_act(obj/item/projectile/Proj)
- switch(Proj.damage_type)
- if(BRUTE)
- take_damage(Proj.damage, component_probability = Proj.damage/2)
- if(BURN)
- take_damage(Proj.damage, component_probability = Proj.damage/1.5)
+/obj/item/device/modular_computer/deconstruct(disassembled = TRUE)
+ break_apart()
/obj/item/device/modular_computer/proc/break_apart()
- physical.visible_message("\The [src] breaks apart!")
- var/turf/newloc = get_turf(src)
- new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
- for(var/C in all_components)
- var/obj/item/weapon/computer_hardware/H = all_components[C]
- uninstall_component(H)
- H.forceMove(newloc)
- if(prob(25))
- H.take_damage(rand(10,30))
+ if(!(flags & NODECONSTRUCT))
+ physical.visible_message("\The [src] breaks apart!")
+ var/turf/newloc = get_turf(src)
+ new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
+ for(var/C in all_components)
+ var/obj/item/weapon/computer_hardware/H = all_components[C]
+ uninstall_component(H)
+ H.forceMove(newloc)
+ if(prob(25))
+ H.take_damage(rand(10,30), BRUTE, 0, 0)
relay_qdel()
- qdel()
+ qdel(src)
diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm
index d50b9f9fd30..e9b7f8d52ff 100644
--- a/code/modules/modular_computers/computers/item/processor.dm
+++ b/code/modules/modular_computers/computers/item/processor.dm
@@ -30,8 +30,8 @@
hardware_flag = machinery_computer.hardware_flag
max_hardware_size = machinery_computer.max_hardware_size
steel_sheet_cost = machinery_computer.steel_sheet_cost
- max_damage = machinery_computer._max_damage
- broken_damage = machinery_computer._break_damage
+ max_integrity = machinery_computer.max_integrity
+ integrity_failure = machinery_computer.integrity_failure
base_active_power_usage = machinery_computer.base_active_power_usage
base_idle_power_usage = machinery_computer.base_idle_power_usage
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index e04bc0cee73..12efea42f9b 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -28,9 +28,6 @@ var/list/global_modular_computers = list()
var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
- var/_max_damage = 100
- var/_break_damage = 50
-
var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
/obj/machinery/modular_computer/New()
@@ -69,7 +66,7 @@ var/list/global_modular_computers = list()
else
overlays.Add(screen_icon_state_menu)
- if(cpu && cpu.damage > cpu.broken_damage)
+ if(cpu && cpu.obj_integrity <= cpu.integrity_failure)
add_overlay("bsod")
add_overlay("broken")
diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm
index cebb1f4d715..60315198ca6 100644
--- a/code/modules/modular_computers/computers/machinery/modular_console.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_console.dm
@@ -16,8 +16,9 @@
max_hardware_size = 4
steel_sheet_cost = 10
light_strength = 2
- _max_damage = 300
- _break_damage = 150
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 150
/obj/machinery/modular_computer/console/buildable/New()
..()
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
index 89040ca7ae7..4278159d1a9 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -23,7 +23,7 @@
var/obj/item/weapon/computer_hardware/battery/battery_module = computer.all_components[MC_CELL]
var/obj/item/weapon/computer_hardware/recharger/recharger = computer.all_components[MC_CHARGE]
qdel(hard_drive)
- computer.take_damage(25, 10, 1, 1)
+ computer.take_damage(25, BRUTE, 0, 0)
if(battery_module && prob(25))
qdel(battery_module)
computer.visible_message("\The [computer]'s battery explodes in rain of sparks.")
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index 81f61671555..d1d51ead8e7 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -42,12 +42,12 @@
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
if(istype(I, /obj/item/stack/cable_coil))
var/obj/item/stack/S = I
- if(!damage)
+ if(obj_integrity == max_integrity)
user << "\The [src] doesn't seem to require repairs."
return 1
if(S.use(1))
user << "You patch up \the [src] with a bit of \the [I]."
- take_damage(-10)
+ obj_integrity = min(obj_integrity + 10, max_integrity)
return 1
if(try_insert(I, user))
@@ -82,12 +82,6 @@
else if(damage)
user << "It seems to be slightly damaged."
-// Damages the component. Contains necessary checks. Negative damage "heals" the component.
-/obj/item/weapon/computer_hardware/proc/take_damage(var/amount)
- damage += round(amount) // We want nice rounded numbers here.
- damage = max(0, min(damage, max_damage)) // Clamp the value.
-
-
// Component-side compatibility check.
/obj/item/weapon/computer_hardware/proc/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
return can_install
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index 1df674feb32..2a82af08084 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -66,7 +66,7 @@ Contents:
var/list/possible_targets = list()
for(var/datum/mind/M in ticker.minds)
if(M.current && M.current.stat != DEAD)
- if(istype(M.current,/mob/living/carbon/human))
+ if(ishuman(M.current))
if(M.special_role)
possible_targets[M] = 0 //bad-guy
else if(M.assigned_role in command_positions)
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index f4273460c7c..b37bc147cb9 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -41,7 +41,7 @@
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
if(!candrain || draining)
return 0
- if(!istype(loc, /mob/living/carbon/human))
+ if(!ishuman(loc))
return 0 //Only works while worn
var/mob/living/carbon/human/H = loc
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 67f9e8e8255..a29a42f89a7 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -14,25 +14,19 @@ It is possible to destroy the net by the occupant or someone else.
mouse_opacity = 1//So you can hit it with stuff.
anchored = 1//Can't drag/grab the trapped mob.
layer = ABOVE_ALL_MOB_LAYER
- var/health = 25//How much health it has.
+ obj_integrity = 25//How much health it has.
+ max_integrity = 25
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
-/obj/structure/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
- else
- return
- health -= damage
- if(health <=0)
- qdel(src)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
/obj/structure/energy_net/Destroy()
if(affecting)
@@ -67,12 +61,13 @@ It is possible to destroy the net by the occupant or someone else.
density = 0//Make the net pass-through.
invisibility = INVISIBILITY_ABSTRACT//Make the net invisible so all the animations can play out.
- health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
+ resistance_flags |= INDESTRUCTIBLE //Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
for(var/obj/item/W in M)
- if(istype(M,/mob/living/carbon/human))
- if(W==M:w_uniform)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(W == H.w_uniform)
continue//So all they're left with are shoes and uniform.
- if(W==M:shoes)
+ if(W == H.shoes)
continue
M.unEquip(W)
@@ -101,61 +96,7 @@ It is possible to destroy the net by the occupant or someone else.
-/obj/structure/energy_net/bullet_act(obj/item/projectile/Proj)
- . = ..()
- take_damage(Proj.damage, Proj.damage_type)
-
-
-
-/obj/structure/energy_net/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- qdel(src)
- if(3)
- take_damage(rand(10,25), BRUTE, 0)
-
-/obj/structure/energy_net/blob_act(obj/structure/blob/B)
- qdel(src)
-
-/obj/structure/energy_net/hitby(atom/movable/AM)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 10
- else if(isobj(AM))
- var/obj/O = AM
- tforce = O.throwforce
- take_damage(tforce)
-
-
-/obj/structure/energy_net/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- user.visible_message("[user] rips the energy net apart!", \
- "You easily destroy the energy net.")
- qdel(src)
-
-
-
/obj/structure/energy_net/attack_paw(mob/user)
return attack_hand()
-
-/obj/structure/energy_net/attack_alien(mob/living/user)
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
- user.visible_message("[user] slices the energy net apart!", \
- "\green You slice the energy net to pieces.")
- qdel(src)
-
-
-
-/obj/structure/energy_net/attacked_by(obj/item/weapon/W, mob/user)
- ..()
- take_damage(W.force, W.damtype)
-
-
-
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 64666922379..b196e0663fa 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -24,7 +24,7 @@
spawn(0)//Parallel processing.
E.process(C)
else
- H << "They are already trapped inside an energy net!"
+ H << "[C.p_they(TRUE)] are already trapped inside an energy net!"
else
- H << "They will bring no honor to your Clan!"
+ H << "[C.p_they(TRUE)] will bring no honor to your Clan!"
return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
index 50fdd52b241..12c9b82a584 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
@@ -12,7 +12,7 @@ Contents:
//Handles elporting while grabbing someone
/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/H)
- if(H.pulling && (istype(H.pulling, /mob/living)))
+ if(H.pulling && (isliving(H.pulling)))
var/mob/living/victim = H.pulling
if(!victim.anchored)
victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 68a8645ccc5..9d53bbf1c82 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -281,5 +281,5 @@ They *could* go in their appropriate files, but this is supposed to be modular
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
playsound(src, "sparks", 50, 1)
- visible_message("[H] electrocutes [src] with [H.their_pronoun()] touch!", "[H] electrocutes you with [H.their_pronoun()] touch!")
+ visible_message("[H] electrocutes [src] with [H.p_their()] touch!", "[H] electrocutes you with [H.p_their()] touch!")
electrocute_act(25, H)
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index fa8013941ad..ac8326b13fb 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -7,7 +7,7 @@
permeability_coefficient = 0.01
flags = NOSLIP
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 120
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 70c3a964374..bdf6f2b3eb4 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -18,8 +18,8 @@ Contents:
item_state = "s-ninja_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
slowdown = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ resistance_flags = LAVA_PROOF | ACID_PROOF
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 12
//Important parts of the suit.
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index b1ef1644340..418ab389ab0 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -10,7 +10,7 @@
var/obj/item/weapon/pen/haspen //The stored pen.
var/obj/item/weapon/paper/toppaper //The topmost piece of paper.
slot_flags = SLOT_BELT
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/clipboard/New()
update_icon()
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index 212cd9372d1..60e324d1842 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -172,7 +172,7 @@
/obj/item/weapon/paper/contract/infernal/attack(mob/M, mob/living/user)
add_fingerprint(user)
if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user, 1))
- user.visible_message("[user] slices [user.their_pronoun()] wrist with [src], and scrawls [user.their_pronoun()] name in blood.", "You slice your wrist open and scrawl your name in blood.")
+ user.visible_message("[user] slices [user.p_their()] wrist with [src], and scrawls [user.p_their()] name in blood.", "You slice your wrist open and scrawl your name in blood.")
user.blood_volume = max(user.blood_volume - 100, 0)
else
return ..()
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 2a35bfff8ff..6d5a27fe467 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -36,11 +36,12 @@
if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo))
I.loc = src
-/obj/structure/filingcabinet/ex_act(severity, target)
- for(var/obj/item/I in src)
- I.loc = src.loc
+/obj/structure/filingcabinet/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ for(var/obj/item/I in src)
+ I.forceMove(loc)
qdel(src)
- ..()
/obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/documents))
@@ -53,9 +54,11 @@
icon_state = initial(icon_state)
updateUsrDialog()
else if(istype(P, /obj/item/weapon/wrench))
+ user << "You begin to [anchored ? "wrench" : "unwrench"] [src]."
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- anchored = !anchored
- user << "You [anchored ? "wrench" : "unwrench"] [src]."
+ if(do_after(user, 20, target = src))
+ user << "You successfully [anchored ? "wrench" : "unwrench"] [src]."
+ anchored = !anchored
else if(user.a_intent != "harm")
user << "You can't put [P] in [src]!"
else
@@ -131,6 +134,7 @@
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
+
/obj/structure/filingcabinet/security/attack_hand()
populate()
..()
@@ -212,16 +216,3 @@ var/list/employmentCabinets = list()
cooldown = 0
else
user << "The [src] is jammed, give it a few seconds."
-
-
-
-
-/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params)
- if(istype(P, /obj/item/weapon/wrench))
- user << "You begin to [anchored ? "wrench" : "unwrench"] [src]."
- if (do_after(user,300,user))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- anchored = !anchored
- user << "You successfully [anchored ? "wrench" : "unwrench"] [src]."
- else
- return ..()
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index cec63a72253..ace6a835e78 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -5,7 +5,7 @@
icon_state = "folder"
w_class = 2
pressure_resistance = 2
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/folder/blue
desc = "A blue folder."
diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm
index 963e094e845..ee80b828451 100644
--- a/code/modules/paperwork/handlabeler.dm
+++ b/code/modules/paperwork/handlabeler.dm
@@ -9,8 +9,7 @@
var/mode = 0
/obj/item/weapon/hand_labeler/suicide_act(mob/user)
- user.visible_message("[user] is pointing \the [src] \
- at \himself. They're going to label themselves as a suicide!")
+ user.visible_message("[user] is pointing \the [src] at [user.p_them()]self. [user.p_theyre(TRUE)] going to label [user.p_them()]self as a suicide!")
labels_left = max(labels_left - 1, 0)
var/old_real_name = user.real_name
@@ -96,7 +95,7 @@
/obj/item/weapon/hand_labeler/borg/afterattack(atom/A, mob/user, proximity)
..(A, user, proximity)
- if(!isrobot(user))
+ if(!iscyborg(user))
return
var/mob/living/silicon/robot/borgy = user
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 64d0ad1ca6d..3ddb31a8343 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -17,8 +17,9 @@
pressure_resistance = 0
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
dog_fashion = /datum/dog_fashion/head
var/info //What's actually written on the paper.
@@ -338,8 +339,8 @@
add_fingerprint(user)
-/obj/item/weapon/paper/fire_act()
- ..(0)
+/obj/item/weapon/paper/fire_act(exposed_temperature, exposed_volume)
+ ..()
icon_state = "paper_onfire"
info = "[stars(info)]"
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 487a7457a4c..e66f9992800 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -106,8 +106,9 @@
desc = "A little slip of paper left over after a larger piece was cut. Whoa."
icon_state = "paperslip"
icon = 'icons/obj/bureaucracy.dmi'
- resistance_flags = 0
- burntime = 3
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
/obj/item/weapon/paperslip/New()
..()
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 4c9da27c069..e6703e9718d 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -9,11 +9,10 @@
throw_speed = 3
throw_range = 7
pressure_resistance = 8
- resistance_flags = 0
var/amount = 30 //How much paper is in the bin.
var/list/papers = list() //List of papers put in the bin for reference.
-/obj/item/weapon/paper_bin/fire_act()
+/obj/item/weapon/paper_bin/fire_act(exposed_temperature, exposed_volume)
if(!amount)
return
..()
@@ -25,10 +24,11 @@
papers = null
. = ..()
-/obj/item/weapon/paper_bin/burn()
- amount = 0
- extinguish()
- update_icon()
+/obj/item/weapon/paper_bin/fire_act(exposed_temperature, exposed_volume)
+ if(amount)
+ amount = 0
+ update_icon()
+ ..()
/obj/item/weapon/paper_bin/MouseDrop(atom/over_object)
var/mob/living/M = usr
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index a5a72604e93..f3827856ded 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -7,8 +7,9 @@
throw_speed = 1
throwforce = 0
w_class = 1
- resistance_flags = 0
- burntime = 4
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
var/obj/item/weapon/paper/internalPaper
var/list/stamped = list()
@@ -79,7 +80,6 @@
if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper
return
- internalPaper.burntime = 1 //its already pretty burnt out
user.unEquip(src)
user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!")
fire_act()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index b5e0c64b81a..2462a5bcdc8 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -18,6 +18,9 @@
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 100
var/obj/item/weapon/paper/copy = null //what's in the copier!
var/obj/item/weapon/photo/photocopy = null
var/obj/item/documents/doccopy = null
@@ -49,7 +52,7 @@
dat += "Printing in [greytoggle]
"
else if(toner)
dat += "Please insert paper to copy.
"
- if(istype(user,/mob/living/silicon/ai))
+ if(isAI(user))
dat += "Print photo from database
"
dat += "Current toner level: [toner]"
if(!toner)
@@ -195,7 +198,8 @@
copies++
updateUsrDialog()
else if(href_list["aipic"])
- if(!istype(usr,/mob/living/silicon/ai)) return
+ if(!isAI(usr))
+ return
if(toner >= 5 && !busy)
var/list/nametemp = list()
var/find
@@ -250,8 +254,9 @@
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
if(istype(O,/obj/item/weapon/paper/contract/infernal))
- user << "The [src] smokes, smelling of brimstone!"
- resistance_flags |= ON_FIRE
+ user << "[src] smokes, smelling of brimstone!"
+ resistance_flags |= FLAMMABLE
+ fire_act()
else
if(!user.drop_item())
return
@@ -303,28 +308,8 @@
else
return ..()
-/obj/machinery/photocopier/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- qdel(src)
- else
- if(toner > 0)
- new /obj/effect/decal/cleanable/oil(get_turf(src))
- toner = 0
- else
- if(prob(50))
- if(toner > 0)
- new /obj/effect/decal/cleanable/oil(get_turf(src))
- toner = 0
-
-
-/obj/machinery/photocopier/blob_act(obj/structure/blob/B)
- if(prob(50))
- qdel(src)
- else
+/obj/machinery/photocopier/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
if(toner > 0)
new /obj/effect/decal/cleanable/oil(get_turf(src))
toner = 0
@@ -369,7 +354,7 @@
ass = null
updateUsrDialog()
return 0
- else if(istype(ass,/mob/living/carbon/human))
+ else if(ishuman(ass))
if(!ass.get_item_by_slot(slot_w_uniform) && !ass.get_item_by_slot(slot_wear_suit))
return 1
else
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 58fcfd4e639..bf6bfcd02a3 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -17,7 +17,7 @@
icon_state = "film"
item_state = "electropack"
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
* Photo
@@ -28,8 +28,9 @@
icon_state = "photo"
item_state = "paper"
w_class = 1
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/blueprints = 0 //Does it include the blueprints?
@@ -94,7 +95,7 @@
icon_state = "album"
item_state = "briefcase"
can_hold = list(/obj/item/weapon/photo)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
* Camera
@@ -188,7 +189,7 @@
for(var/atom/movable/A in T)
if(A.invisibility)
if(see_ghosts)
- if(istype(A, /mob/dead/observer))
+ if(isobserver(A))
var/mob/dead/observer/O = A
if(O.orbiting) //so you dont see ghosts following people like antags, etc.
continue
@@ -210,8 +211,10 @@
for(var/atom/A in sorted)
var/icon/img = getFlatIcon(A)
- if(istype(A, /mob/living) && A:lying)
- img.Turn(A:lying)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.lying)
+ img.Turn(L.lying)
var/offX = 32 * (A.x - center.x) + A.pixel_x + 33
var/offY = 32 * (A.y - center.y) + A.pixel_y + 33
@@ -234,7 +237,7 @@
var/mob_detail
for(var/mob/M in the_turf)
if(M.invisibility)
- if(see_ghosts && istype(M,/mob/dead/observer))
+ if(see_ghosts && isobserver(M))
var/mob/dead/observer/O = M
if(O.orbiting)
continue
@@ -247,12 +250,12 @@
var/list/holding = list()
- if(istype(M, /mob/living))
+ if(isliving(M))
var/mob/living/L = M
for(var/obj/item/I in L.held_items)
if(!holding)
- holding += "They are holding \a [I]"
+ holding += "[L.p_they(TRUE)] [L.p_are()] holding \a [I]"
else
holding += " and \a [I]"
holding = holding.Join()
@@ -268,7 +271,7 @@
/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag) //Proc for both regular and AI-based camera to take the image
var/mobs = ""
- var/isAi = istype(user, /mob/living/silicon/ai)
+ var/isAi = isAI(user)
var/list/seen
if(!isAi) //crappy check, but without it AI photos would be subject to line of sight from the AI Eye object. Made the best of it by moving the sec camera check inside
if(user.client) //To make shooting through security cameras possible
@@ -409,7 +412,7 @@
qdel(P) //so 10 thousand picture items are not left in memory should an AI take them and then view them all
/obj/item/device/camera/siliconcam/proc/viewpictures(user)
- if(isrobot(user)) // Cyborg
+ if(iscyborg(user)) // Cyborg
var/mob/living/silicon/robot/C = src.loc
var/obj/item/device/camera/siliconcam/Cinfo
if(C.connected_ai)
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index 89d63ba3f06..dcc443b2938 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -181,6 +181,7 @@
else
return ..()
+
/obj/machinery/power/am_control_unit/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
@@ -278,7 +279,7 @@
/obj/machinery/power/am_control_unit/interact(mob/user)
if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
- if(!istype(user, /mob/living/silicon/ai))
+ if(!isAI(user))
user.unset_machine()
user << browse(null, "window=AMcontrol")
return
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 7524010b166..860a80a3912 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -119,11 +119,11 @@
shutdown_core()
-/obj/machinery/am_shielding/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/am_shielding/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
- if(damage)
+ if(damage_amount)
playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
@@ -132,8 +132,8 @@
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
else
return
- if(damage >= 10)
- stability -= damage/2
+ if(damage_amount >= 10)
+ stability -= damage_amount/2
check_stability()
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index a394940966d..d43314eb8f5 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -48,6 +48,10 @@
anchored = 1
use_power = 0
req_access = list(access_engine_equip)
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
+ armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100, fire = 90, acid = 50)
var/area/area
var/areastring = null
var/obj/item/weapon/stock_parts/cell/cell
@@ -93,7 +97,7 @@
var/global/list/status_overlays_equipment
var/global/list/status_overlays_lighting
var/global/list/status_overlays_environ
- var/health = 50
+
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
@@ -183,7 +187,6 @@
/obj/machinery/power/apc/examine(mob/user)
..()
if(stat & BROKEN)
- user << "Looks broken."
return
if(opened)
if(has_electronics && terminal)
@@ -368,7 +371,7 @@
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params)
- if (istype(user, /mob/living/silicon) && get_dist(src,user)>1)
+ if(issilicon(user) && get_dist(src,user)>1)
return src.attack_hand(user)
if (istype(W, /obj/item/weapon/crowbar) && opened)
if (has_electronics==1)
@@ -411,7 +414,7 @@
return
if(!user.drop_item())
return
- W.loc = src
+ W.forceMove(src)
cell = W
user.visible_message(\
"[user.name] has inserted the power cell to [src.name]!",\
@@ -555,13 +558,21 @@
else
return ..()
-/obj/machinery/power/apc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- ..()
- if((malfhack || (stat & BROKEN)) && !opened)
- if(damage < 10)
- return
- health -= damage
- if(health <= 0)
+/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 15 && (!(stat & BROKEN) || malfai))
+ return 0
+ . = ..()
+
+
+/obj/machinery/power/apc/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
+ set_broken()
+
+/obj/machinery/power/apc/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ set_broken()
+ if(opened != 2)
opened = 2
visible_message("The APC cover is knocked down!")
update_icon()
@@ -602,28 +613,9 @@
..()
/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user)
- ..()
- if(malfhack || (stat & BROKEN))
+ if(malfhack)
return
- if(opened == 0)
- if(!panel_open)
- panel_open = 1
- update_icon()
- visible_message("The [src.name]'s cover flies open, exposing the wires!")
-
- else if(panel_open && !wires.is_all_cut())
- wires.cut_all()
- update_icon()
- visible_message("The [src.name]'s wires are shredded!")
- else if(opened == 1)
- if(cell)
- cell.loc = user.loc
- cell.updateicon()
- cell = null
- visible_message("The [src.name]'s power cell flies off!")
- charging = 0
- update_icon()
-
+ ..()
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = default_state)
@@ -1084,17 +1076,6 @@
addtimer(src, "reset", 600, FALSE, APC_RESET_EMP)
..()
-/obj/machinery/power/apc/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- if(prob(50))
- set_broken()
- if(3)
- if(prob(25))
- set_broken()
-
/obj/machinery/power/apc/blob_act(obj/structure/blob/B)
set_broken()
@@ -1124,7 +1105,7 @@
for(var/area/A in area.related)
for(var/obj/machinery/light/L in A)
L.on = 1
- L.broken()
+ L.break_light_tube()
stoplag()
/obj/machinery/power/apc/proc/shock(mob/user, prb)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 4ce5dfb3f9a..8988e119ca2 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -97,9 +97,16 @@ By design, d1 is the smallest direction and d2 is the highest
if(invisibility != INVISIBILITY_MAXIMUM)
qdel(src)
-/obj/structure/cable/Deconstruct()
- var/turf/T = loc
- stored.loc = T
+/obj/structure/cable/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/turf/T = loc
+ stored.forceMove(T)
+ qdel(src)
+
+/obj/structure/cable/fire_act(exposed_temperature, exposed_volume)
+ var/turf/T = src.loc
+ if(T && T.intact) //protected from fire when hidden behind a floor.
+ return
..()
///////////////////////////////////
@@ -109,7 +116,7 @@ By design, d1 is the smallest direction and d2 is the highest
//If underfloor, hide the cable
/obj/structure/cable/hide(i)
- if(level == 1 && istype(loc, /turf))
+ if(level == 1 && isturf(loc))
invisibility = i ? INVISIBILITY_MAXIMUM : 0
updateicon()
@@ -138,7 +145,7 @@ By design, d1 is the smallest direction and d2 is the highest
user.visible_message("[user] cuts the cable.", "You cut the cable.")
stored.add_fingerprint(user)
investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires")
- Deconstruct()
+ deconstruct()
return
else if(istype(W, /obj/item/stack/cable_coil))
@@ -169,21 +176,9 @@ By design, d1 is the smallest direction and d2 is the highest
else
return 0
-//explosion handling
-/obj/structure/cable/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- if(prob(50))
- Deconstruct()
- if(3)
- if(prob(25))
- Deconstruct()
-
/obj/structure/cable/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct()
/obj/structure/cable/proc/cableColor(colorC = "red")
cable_color = colorC
@@ -619,7 +614,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
if (C.shock(user, 50))
if (prob(50)) //fail
- C.Deconstruct()
+ C.deconstruct()
// called when cable_coil is click on an installed obj/cable
// or click on a turf that already contains a "node" cable
@@ -684,7 +679,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
if (NC.shock(user, 50))
if (prob(50)) //fail
- NC.Deconstruct()
+ NC.deconstruct()
return
@@ -734,7 +729,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
if (C.shock(user, 50))
if (prob(50)) //fail
- C.Deconstruct()
+ C.deconstruct()
return
C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets.
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 395eebbb65b..ccae16644f3 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -25,7 +25,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
anchored = 1
density = 1
use_power = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/sprite_number = 0
/obj/machinery/gravity_generator/ex_act(severity, target)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 3647c9173e8..6ad8d8eba08 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -16,34 +16,38 @@
desc = "Used for building lights."
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-item"
- result_path = /obj/machinery/light_construct
+ result_path = /obj/structure/light_construct
inverse = 1
/obj/item/wallframe/light_fixture/small
name = "small light fixture frame"
icon_state = "bulb-construct-item"
- result_path = /obj/machinery/light_construct/small
+ result_path = /obj/structure/light_construct/small
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
-/obj/machinery/light_construct
+/obj/structure/light_construct
name = "light fixture frame"
desc = "A light fixture under construction."
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
layer = WALL_OBJ_LAYER
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
+
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
var/obj/machinery/light/newlight = null
-/obj/machinery/light_construct/New(loc, ndir, building)
+/obj/structure/light_construct/New(loc, ndir, building)
..()
if(building)
setDir(ndir)
-/obj/machinery/light_construct/examine(mob/user)
+/obj/structure/light_construct/examine(mob/user)
..()
switch(src.stage)
if(1)
@@ -53,7 +57,7 @@
if(3)
user << "The casing is closed."
-/obj/machinery/light_construct/attackby(obj/item/weapon/W, mob/user, params)
+/obj/structure/light_construct/attackby(obj/item/weapon/W, mob/user, params)
add_fingerprint(user)
switch(stage)
if(1)
@@ -116,17 +120,24 @@
return
return ..()
-/obj/machinery/light_construct/blob_act(obj/structure/blob/B)
+/obj/structure/light_construct/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
qdel(src)
-/obj/machinery/light_construct/small
+/obj/structure/light_construct/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, sheets_refunded)
+ qdel(src)
+
+/obj/structure/light_construct/small
name = "small light fixture frame"
icon_state = "bulb-construct-stage1"
fixture_type = "bulb"
sheets_refunded = 1
+
+
// the standard tube light fixture
/obj/machinery/light
name = "light fixture"
@@ -136,6 +147,8 @@
desc = "A lighting fixture."
anchored = 1
layer = WALL_OBJ_LAYER
+ obj_integrity = 100
+ max_integrity = 100
use_power = 2
idle_power_usage = 2
active_power_usage = 20
@@ -152,7 +165,6 @@
// this is used to calc the probability the light burns out
var/rigged = 0 // true if rigged to explode
- var/health = 20
// the smaller bulb light fixture
@@ -163,12 +175,12 @@
brightness = 4
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
- health = 15
+
/obj/machinery/light/Move()
if(status != LIGHT_BROKEN)
- broken(1)
+ break_light_tube(1)
return ..()
/obj/machinery/light/built/New()
@@ -190,11 +202,11 @@
if("tube")
brightness = 8
if(prob(2))
- broken(1)
+ break_light_tube(1)
if("bulb")
brightness = 4
if(prob(5))
- broken(1)
+ break_light_tube(1)
spawn(1)
update(0)
@@ -319,19 +331,7 @@
playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1)
user.visible_message("[user.name] opens [src]'s casing.", \
"You open [src]'s casing.", "You hear a noise.")
- var/obj/machinery/light_construct/newlight = null
- switch(fitting)
- if("tube")
- newlight = new /obj/machinery/light_construct(src.loc)
- newlight.icon_state = "tube-construct-stage2"
-
- if("bulb")
- newlight = new /obj/machinery/light_construct/small(src.loc)
- newlight.icon_state = "bulb-construct-stage2"
- newlight.setDir(src.dir)
- newlight.stage = 2
- transfer_fingerprints_to(newlight)
- qdel(src)
+ deconstruct()
else
user << "You stick \the [W] into the light socket!"
if(has_power() && (W.flags & CONDUCT))
@@ -343,6 +343,32 @@
else
return ..()
+/obj/machinery/light/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/obj/structure/light_construct/newlight = null
+ var/cur_stage = 2
+ if(!disassembled)
+ cur_stage = 1
+ switch(fitting)
+ if("tube")
+ newlight = new /obj/structure/light_construct(src.loc)
+ newlight.icon_state = "tube-construct-stage[cur_stage]"
+
+ if("bulb")
+ newlight = new /obj/structure/light_construct/small(src.loc)
+ newlight.icon_state = "bulb-construct-stage[cur_stage]"
+ newlight.setDir(src.dir)
+ newlight.stage = cur_stage
+ if(!disassembled)
+ newlight.obj_integrity = newlight.max_integrity * 0.5
+ if(status != LIGHT_BROKEN)
+ break_light_tube()
+ if(status != LIGHT_EMPTY)
+ drop_light_tube()
+ new /obj/item/stack/cable_coil(loc, 1, "red")
+ transfer_fingerprints_to(newlight)
+ qdel(src)
+
/obj/machinery/light/attacked_by(obj/item/I, mob/living/user)
..()
if(status == LIGHT_BROKEN || status == LIGHT_EMPTY)
@@ -350,25 +376,27 @@
if(prob(12))
electrocute_mob(user, get_area(src), src, 0.3)
-/obj/machinery/light/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ if(. && !qdeleted(src))
+ if(prob(damage_amount * 5))
+ break_light_tube()
+
+
+
+
+/obj/machinery/light/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- switch(status)
- if(LIGHT_EMPTY)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- if(LIGHT_BROKEN)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1)
- else
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ switch(status)
+ if(LIGHT_EMPTY)
+ playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
+ if(LIGHT_BROKEN)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1)
+ else
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- if(health <= 0)
- broken()
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
// returns whether this light has power
@@ -397,20 +425,6 @@
src.flicker(1)
return
-/obj/machinery/light/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
-/obj/machinery/light/hitby(AM as mob|obj)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 40
- else if(isobj(AM))
- var/obj/item/I = AM
- tforce = I.throwforce
- take_damage(tforce)
-
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player
@@ -444,12 +458,15 @@
user << "You try to remove the light [fitting], but you burn your hand on it!"
var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- if(affecting && affecting.take_damage( 0, 5 )) // 5 burn damage
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
H.update_damage_overlays()
return // if burned, don't remove the light
else
user << "You remove the light [fitting]."
// create a light tube/bulb item and put it in the user's hand
+ drop_light_tube(user)
+
+/obj/machinery/light/proc/drop_light_tube(mob/user)
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
@@ -460,10 +477,11 @@
switchcount = 0
L.update()
- L.add_fingerprint(user)
- L.loc = loc
+ L.forceMove(loc)
- user.put_in_active_hand(L) //puts it in our active hand
+ if(user) //puts it in our active hand
+ L.add_fingerprint(user)
+ user.put_in_active_hand(L)
status = LIGHT_EMPTY
update()
@@ -475,26 +493,13 @@
user << "You telekinetically remove the light [fitting]."
// create a light tube/bulb item and put it in the user's hand
- var/obj/item/weapon/light/L = new light_type()
- L.status = status
- L.rigged = rigged
- L.brightness = brightness
+ drop_light_tube()
- // light item inherits the switchcount, then zero it
- L.switchcount = switchcount
- switchcount = 0
-
- L.update()
- L.add_fingerprint(user)
- L.loc = loc
-
- status = LIGHT_EMPTY
- update()
// break the light and make sparks if was on
-/obj/machinery/light/proc/broken(skip_sound_and_sparks = 0)
- if(status == LIGHT_EMPTY)
+/obj/machinery/light/proc/break_light_tube(skip_sound_and_sparks = 0)
+ if(status == LIGHT_EMPTY || status == LIGHT_BROKEN)
return
if(!skip_sound_and_sparks)
@@ -515,29 +520,6 @@
on = 1
update()
-// explosion effect
-// destroy the whole light fixture or just shatter it
-
-/obj/machinery/light/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- if(prob(50))
- broken()
- if(3)
- if(prob(25))
- broken()
-
-/obj/machinery/light/blob_act(obj/structure/blob/B)
- if(B && B.loc == loc)
- broken()
- qdel(src)
- else if(prob(50))
- broken()
- else
- flicker()
-
/obj/machinery/light/tesla_act(power, explosive = FALSE)
if(explosive)
explosion(src.loc,0,0,0,flame_range = 5, adminlog = 0)
@@ -553,14 +535,14 @@
/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C
- broken()
+ break_light_tube()
// explode the light
/obj/machinery/light/proc/explode()
set waitfor = 0
var/turf/T = get_turf(src.loc)
- broken() // break it first to give a warning
+ break_light_tube() // break it first to give a warning
sleep(2)
explosion(T, 0, 0, 2, 2)
sleep(1)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 01e28bb0f7c..0eea1f23925 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -271,7 +271,7 @@ display round(lastgen) and plasmatank amount
/obj/machinery/power/port_gen/pacman/interact(mob/user)
if (get_dist(src, user) > 1 )
- if (!istype(user, /mob/living/silicon/ai))
+ if(!isAI(user))
user.unset_machine()
user << browse(null, "window=port_gen")
return
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 3d2a726adc4..46bd4b9dc0a 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -117,7 +117,7 @@
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/coil = W
var/turf/T = user.loc
- if(T.intact || !istype(T, /turf/open/floor))
+ if(T.intact || !isfloorturf(T))
return
if(get_dist(src, user) > 1)
return
@@ -279,7 +279,7 @@
/proc/electrocute_mob(mob/living/carbon/M, power_source, obj/source, siemens_coeff = 1)
if(istype(M.loc,/obj/mecha))
return 0 //feckin mechs are dumb
- if(istype(M,/mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm
index 058084e1cec..915f909e231 100644
--- a/code/modules/power/rtg.dm
+++ b/code/modules/power/rtg.dm
@@ -142,7 +142,7 @@
else
overload()
-/obj/machinery/power/rtg/abductor/fire_act()
+/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
overload()
/obj/machinery/power/rtg/abductor/tesla_act()
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index ec4da0d1b2e..74fd320c11d 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -10,6 +10,9 @@ var/global/list/rad_collectors = list()
density = 1
req_access = list(access_engine_equip)
// use_power = 0
+ obj_integrity = 350
+ max_integrity = 350
+ integrity_failure = 80
var/obj/item/weapon/tank/internals/plasma/loaded_tank = null
var/last_power = 0
var/active = 0
@@ -105,12 +108,10 @@ var/global/list/rad_collectors = list()
return ..()
-/obj/machinery/power/rad_collector/ex_act(severity, target)
- switch(severity)
- if(2, 3)
- eject()
- return ..()
-
+/obj/machinery/power/rad_collector/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ eject()
+ stat |= BROKEN
/obj/machinery/power/rad_collector/proc/eject()
locked = 0
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 6b3f4deb296..90a8beff273 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -7,7 +7,7 @@
icon_state = "Contain_F"
anchored = 1
density = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
use_power = 0
luminosity = 4
layer = ABOVE_OBJ_LAYER
@@ -26,11 +26,20 @@
shock(user)
return 1
+/obj/machinery/field/containment/attackby(obj/item/W, mob/user, params)
+ shock(user)
+ return 1
+
+/obj/machinery/field/containment/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BURN)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
+ if(BRUTE)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
/obj/machinery/field/containment/blob_act(obj/structure/blob/B)
return 0
-
/obj/machinery/field/containment/ex_act(severity, target)
return 0
@@ -69,6 +78,8 @@
/obj/machinery/field/containment/Move()
qdel(src)
+
+
// Abstract Field Class
// Used for overriding certain procs
@@ -106,7 +117,6 @@
user.updatehealth()
bump_field(user)
- return
/obj/machinery/field/proc/clear_shock()
hasShocked = 0
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 366bab4bad9..69b592d5fdf 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -30,6 +30,10 @@ field_generator power level display
anchored = 0
density = 1
use_power = 0
+ obj_integrity = 500
+ max_integrity = 500
+ //100% immune to lasers and energy projectiles since it absorbs their energy.
+ armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
var/const/num_power_levels = 6 // Total number of power level icon has
var/power_level = 0
var/active = FG_OFFLINE
@@ -157,7 +161,7 @@ field_generator power level display
if(Proj.flag != "bullet")
power = min(power + Proj.damage, field_generator_max_power)
check_power_level()
- return 0
+ ..()
/obj/machinery/field/generator/Destroy()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index b8140b80a10..64538f978c1 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -26,6 +26,10 @@
icon_state = "none"
anchored = 0
density = 1
+ obj_integrity = 500
+ max_integrity = 500
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 80)
+
var/obj/machinery/particle_accelerator/control_box/master = null
var/construction_state = PA_CONSTRUCTION_UNSECURED
var/reference = null
@@ -143,16 +147,17 @@
return ..()
+/obj/structure/particle_accelerator/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
/obj/structure/particle_accelerator/Move()
..()
if(master && master.active)
master.toggle_power()
investigate_log("was moved whilst active; it powered down.","singulo")
-/obj/structure/particle_accelerator/blob_act(obj/structure/blob/B)
- if(prob(50))
- qdel(src)
-
/obj/structure/particle_accelerator/update_icon()
switch(construction_state)
@@ -165,7 +170,6 @@
icon_state="[reference]p[strength]"
else
icon_state="[reference]c"
- return
/obj/structure/particle_accelerator/proc/update_state()
if(master)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index e64d304c065..ac2ef7fdf4f 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -226,7 +226,7 @@
/obj/machinery/particle_accelerator/control_box/interact(mob/user)
if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
- if(!istype(user, /mob/living/silicon))
+ if(!issilicon(user))
user.unset_machine()
user << browse(null, "window=pacontrol")
return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 2dda4c96dbb..fb9af570189 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -26,7 +26,7 @@
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/last_warning
var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
@@ -60,6 +60,19 @@
consume(user)
return 1
+/obj/singularity/attack_paw(mob/user)
+ consume(user)
+
+/obj/singularity/attack_alien(mob/user)
+ consume(user)
+
+/obj/singularity/attack_animal(mob/user)
+ consume(user)
+
+/obj/singularity/attackby(obj/item/weapon/W, mob/user, params)
+ consume(user)
+ return 1
+
/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man!
return 0
@@ -395,7 +408,7 @@
continue
if(M.stat == CONSCIOUS)
- if (istype(M,/mob/living/carbon/human))
+ if (ishuman(M))
var/mob/living/carbon/human/H = M
if(istype(H.glasses, /obj/item/clothing/glasses/meson))
var/obj/item/clothing/glasses/meson/MS = H.glasses
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index d38b2a9c426..6b19344e683 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -12,7 +12,9 @@
idle_power_usage = 0
active_power_usage = 0
var/id = 0
- var/health = 20
+ obj_integrity = 150
+ max_integrity = 150
+ integrity_failure = 50
var/obscured = 0
var/sunfrac = 0
var/adir = SOUTH // actual dir
@@ -50,7 +52,8 @@
S.anchored = 1
S.loc = src
if(S.glass_type == /obj/item/stack/sheet/rglass) //if the panel is in reinforced glass
- health *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to
+ max_integrity *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to
+ obj_integrity = max_integrity
update_icon()
/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user, params)
@@ -58,54 +61,43 @@
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...")
if(do_after(user, 50/W.toolspeed, target = src))
- var/obj/item/solar_assembly/S = locate() in src
- if(S)
- S.loc = src.loc
- S.give_glass(stat & BROKEN)
-
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.")
- qdel(src)
+ deconstruct(TRUE)
else
return ..()
-/obj/machinery/power/solar/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
-
-/obj/machinery/power/solar/hitby(AM as mob|obj)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 20
- else if(isobj(AM))
- var/obj/item/I = AM
- tforce = I.throwforce
- take_damage(tforce)
-
-/obj/machinery/power/solar/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/power/solar/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(stat & BROKEN)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, 1)
- else
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ if(stat & BROKEN)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, 1)
+ else
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+
+
+/obj/machinery/power/solar/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ stat |= BROKEN
+ unset_control()
+ update_icon()
+
+/obj/machinery/power/solar/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ var/obj/item/solar_assembly/S = locate() in src
+ if(S)
+ S.forceMove(loc)
+ S.give_glass(stat & BROKEN)
else
- return
- health -= damage
- if(health <= 0)
- playsound(src, "shatter", 70, 1)
- new /obj/item/weapon/shard(src.loc)
- new /obj/item/weapon/shard(src.loc)
- qdel(src)
- else if(health <= 10)
- if(!(stat & BROKEN))
- playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
- set_broken()
+ playsound(src, "shatter", 70, 1)
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/shard(src.loc)
+ qdel(src)
+
/obj/machinery/power/solar/update_icon()
..()
@@ -115,7 +107,6 @@
else
add_overlay(image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER))
src.setDir(angle2dir(adir))
- return
//calculates the fraction of the sunlight that the panel recieves
/obj/machinery/power/solar/proc/update_solar_exposure()
@@ -149,21 +140,6 @@
else //if we're no longer on the same powernet, remove from control computer
unset_control()
-/obj/machinery/power/solar/proc/set_broken()
- . = (!(stat & BROKEN))
- stat |= BROKEN
- unset_control()
- update_icon()
-
-
-/obj/machinery/power/solar/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- take_damage(rand(10,20), BRUTE, 0)
- if(3)
- take_damage(rand(5,15), BRUTE, 0)
/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc, S, 0)
@@ -289,7 +265,9 @@
density = 1
use_power = 1
idle_power_usage = 250
- var/health = 25
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 100
var/icon_screen = "solar"
var/icon_keyboard = "power_key"
var/id = 0
@@ -468,25 +446,18 @@
else
return ..()
-/obj/machinery/power/solar_control/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
-
-/obj/machinery/power/solar_control/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/power/solar_control/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(stat & BROKEN)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- else
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ if(stat & BROKEN)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ else
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- if(health <= 0 && !(stat & BROKEN))
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/machinery/power/solar_control/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
stat |= BROKEN
update_icon()
@@ -523,24 +494,6 @@
update_icon()
-/obj/machinery/power/solar_control/proc/set_broken()
- stat |= BROKEN
- update_icon()
-
-
-/obj/machinery/power/solar_control/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- take_damage(rand(20,30), BRUTE, 0)
- if(3)
- take_damage(rand(10,20), BRUTE, 0)
-
-/obj/machinery/power/solar_control/blob_act(obj/structure/blob/B)
- if (prob(75))
- set_broken()
- src.density = 0
//
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 28b0a7ef434..8f5c739346a 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -76,7 +76,9 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
- qdel(radio)
+ if(radio)
+ qdel(radio)
+ radio = null
poi_list -= src
. = ..()
@@ -94,7 +96,7 @@
if(!istype(T)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now.
return //Yeah just stop.
- if(istype(T, /turf/open/space)) // Stop processing this stuff if we've been ejected.
+ if(isspaceturf(T)) // Stop processing this stuff if we've been ejected.
return
if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
@@ -243,13 +245,13 @@
return(gain)
/obj/machinery/power/supermatter_shard/blob_act(obj/structure/blob/B)
- if(B && !istype(loc, /turf/open/space)) //does nothing in space
+ if(B && !isspaceturf(loc)) //does nothing in space
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
- damage += B.health * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us
- if(B.health > 100)
+ damage += B.obj_integrity * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us
+ if(B.obj_integrity > 100)
B.visible_message("\The [B] strikes at \the [src] and flinches away!",\
"You hear a loud crack as you are washed with a wave of heat.")
- B.take_damage(100, BURN, src)
+ B.take_damage(100, BURN)
else
B.visible_message("\The [B] strikes at \the [src] and rapidly flashes to ash.",\
"You hear a loud crack as you are washed with a wave of heat.")
@@ -299,7 +301,7 @@
/obj/machinery/power/supermatter_shard/Bumped(atom/AM as mob|obj)
- if(istype(AM, /mob/living))
+ if(isliving(AM))
AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\
"You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\
"You hear an unearthly noise as a wave of heat washes over you.")
@@ -315,7 +317,7 @@
/obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM)
- if(istype(AM, /mob/living))
+ if(isliving(AM))
var/mob/living/user = AM
message_admins("[src] has consumed [key_name_admin(user)]? (FLW) (JMP).")
investigate_log("has consumed [key_name(user)].", "supermatter")
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index f3fcb43585b..68aa7191683 100644
--- a/code/modules/power/terminal.dm
+++ b/code/modules/power/terminal.dm
@@ -48,7 +48,7 @@
/obj/machinery/power/terminal/proc/dismantle(mob/living/user)
- if(istype(loc, /turf))
+ if(isturf(loc))
var/turf/T = loc
if(T.intact)
user << "You must first expose the power terminal!"
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 4f6fc7641b8..5586ab59435 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -194,7 +194,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(closest_grounding_rod || is_type_in_typecache(A, blacklisted_tesla_types))
continue
- else if(istype(A, /mob/living))
+ else if(isliving(A))
var/dist = get_dist(source, A)
var/mob/living/L = A
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD)
@@ -253,7 +253,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(closest_mob)
var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5, 5)
closest_mob.electrocute_act(shock_damage, source, 1, tesla_shock = 1)
- if(istype(closest_mob, /mob/living/silicon))
+ if(issilicon(closest_mob))
var/mob/living/silicon/S = closest_mob
S.emp_act(2)
tesla_zap(S, 7, power / 1.5) // metallic folks bounce it further
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 928e98563f3..0f37617704b 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -11,6 +11,9 @@
anchored = 1
density = 1
use_power = 0
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 50
var/id = 0
var/sun_angle = 0 // sun angle as set by sun datum
@@ -64,16 +67,31 @@
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar tracker.", "You begin to take the glass off the solar tracker...")
if(do_after(user, 50/W.toolspeed, target = src))
- var/obj/item/solar_assembly/S = locate() in src
- if(S)
- S.loc = src.loc
- S.give_glass(stat & BROKEN)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the tracker.", "You take the glass off the tracker.")
- qdel(src)
+ deconstruct(TRUE)
else
return ..()
+/obj/machinery/power/tracker/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ stat |= BROKEN
+ unset_control()
+
+/obj/machinery/power/solar/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ var/obj/item/solar_assembly/S = locate() in src
+ if(S)
+ S.forceMove(loc)
+ S.give_glass(stat & BROKEN)
+ else
+ playsound(src, "shatter", 70, 1)
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/shard(src.loc)
+ qdel(src)
+
// Tracker Electronic
/obj/item/weapon/electronics/tracker
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index cb2d5457682..abbfc960e95 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -29,6 +29,7 @@
icon_state = "compressor"
anchored = 1
density = 1
+ resistance_flags = FIRE_PROOF
var/obj/machinery/power/turbine/turbine
var/datum/gas_mixture/gas_contained
var/turf/inturf
@@ -47,6 +48,7 @@
icon_state = "turbine"
anchored = 1
density = 1
+ resistance_flags = FIRE_PROOF
var/opened = 0
var/obj/machinery/power/compressor/compressor
var/turf/outturf
@@ -155,7 +157,7 @@
// RPM function to include compression friction - be advised that too low/high of a compfriction value can make things screwy
- rpm = max(0, rpm - (rpm*rpm)/(COMPFRICTION/efficiency))
+ rpm = max(0, rpm - (rpm*rpm)/(COMPFRICTION*efficiency))
if(starter && !(stat & NOPOWER))
@@ -291,7 +293,7 @@
/obj/machinery/power/turbine/interact(mob/user)
- if ( !Adjacent(user) || (stat & (NOPOWER|BROKEN)) && (!istype(user, /mob/living/silicon)) )
+ if(!Adjacent(user) || (stat & (NOPOWER|BROKEN)) && !issilicon(user))
user.unset_machine(src)
user << browse(null, "window=turbine")
return
diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm
index 33ff0ee2235..0ad35adddba 100644
--- a/code/modules/procedural_mapping/mapGeneratorModule.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModule.dm
@@ -114,7 +114,7 @@
if(A.density)
. = 0
break
- if(!allowAtomsOnSpace && (istype(T,/turf/open/space)))
+ if(!allowAtomsOnSpace && (isspaceturf(T)))
. = 0
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index ede8268be7d..8c44806da96 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -389,7 +389,7 @@ obj/item/weapon/gun/proc/newshot()
return
if(user == target)
- target.visible_message("[user] sticks [src] in [user.their_pronoun()] mouth, ready to pull the trigger...", \
+ target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \
"You stick [src] in your mouth, ready to pull the trigger...")
else
target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \
@@ -484,8 +484,3 @@ obj/item/weapon/gun/proc/newshot()
azoom = new()
azoom.gun = src
-
-/obj/item/weapon/gun/burn()
- if(pin)
- qdel(pin)
- .=..()
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index f729b9966cf..185d5ff2654 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -47,6 +47,9 @@
fire_delay = shot.delay
/obj/item/weapon/gun/energy/Destroy()
+ if(power_supply)
+ qdel(power_supply)
+ power_supply = null
STOP_PROCESSING(SSobj, src)
return ..()
@@ -155,7 +158,7 @@
return (OXYLOSS)
/obj/item/weapon/gun/energy/proc/robocharge()
- if(isrobot(src.loc))
+ if(iscyborg(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
@@ -170,7 +173,3 @@
STOP_PROCESSING(SSobj, src)
..()
-/obj/item/weapon/gun/energy/burn()
- if(power_supply)
- qdel(power_supply)
- .=..()
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index bb586419f9b..16c1d39d016 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -147,7 +147,7 @@
KA.modify_projectile(BB)
var/turf/proj_turf = get_turf(BB)
- if(!istype(proj_turf, /turf))
+ if(!isturf(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
@@ -182,7 +182,7 @@
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
- if(istype(target_turf, /turf/closed/mineral))
+ if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer)
var/obj/effect/overlay/temp/kinetic_blast/K = PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, target_turf)
@@ -191,7 +191,7 @@
PoolOrNew(type, target_turf)
if(turf_aoe)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
- if(istype(T, /turf/closed/mineral))
+ if(ismineralturf(T))
var/turf/closed/mineral/M = T
M.gets_drilled(firer)
if(mob_aoe)
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 474e5373227..527f4cd8814 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -93,7 +93,7 @@
..()
/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck()
- if(prob(fail_chance) && istype(loc, /mob/living))
+ if(prob(fail_chance) && isliving(loc))
var/mob/living/M = loc
switch(fail_tick)
if(0 to 200)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 313e2814ccc..da8e2c83ec7 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -10,7 +10,7 @@
hitsound = 'sound/weapons/pierce.ogg'
var/hitsound_wall = ""
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
var/obj/item/ammo_casing/ammo_casing = null
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 28902c019dc..81c5bb9ddc1 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -66,7 +66,7 @@
/obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0)
. = ..()
- if(istype(target,/turf/)||istype(target,/obj/structure/))
+ if(isturf(target) || istype(target,/obj/structure/))
target.ex_act(2)
/obj/item/projectile/beam/pulse/shot
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index ab287338cc9..dfeeb98b2d8 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -250,7 +250,7 @@
breakthings = FALSE
/obj/item/projectile/bullet/sniper/soporific/on_hit(atom/target, blocked = 0)
- if((blocked != 100) && istype(target, /mob/living))
+ if((blocked != 100) && isliving(target))
var/mob/living/L = target
L.Sleeping(20)
return ..()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 9b94ffd17f5..fe6dd50c645 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -126,7 +126,7 @@
OpenDoor(target)
else
var/turf/T = get_turf(target)
- if(istype(T,/turf/closed) && !istype(T, /turf/closed/indestructible))
+ if(isclosedturf(T) && !istype(T, /turf/closed/indestructible))
CreateDoor(T)
/obj/item/projectile/magic/door/proc/CreateDoor(turf/T)
@@ -164,7 +164,7 @@
var/list/contents = M.contents.Copy()
- if(istype(M, /mob/living/silicon/robot))
+ if(iscyborg(M))
var/mob/living/silicon/robot/Robot = M
if(Robot.mmi)
qdel(Robot.mmi)
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 6a991950ff0..81e7bd0476f 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -171,7 +171,7 @@
/obj/item/projectile/plasma/New()
var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
+ if(!isturf(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
if(environment)
@@ -184,7 +184,7 @@
/obj/item/projectile/plasma/on_hit(atom/target)
. = ..()
- if(istype(target, /turf/closed/mineral))
+ if(ismineralturf(target))
var/turf/closed/mineral/M = target
M.gets_drilled(firer)
Range()
diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm
index b32e9da1753..b99a7ced9c5 100644
--- a/code/modules/reagents/chem_splash.dm
+++ b/code/modules/reagents/chem_splash.dm
@@ -6,7 +6,7 @@
proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1)
- if(!istype(epicenter, /turf) || !reactants.len || threatscale <= 0)
+ if(!isturf(epicenter) || !reactants.len || threatscale <= 0)
return
var/has_reagents
var/total_reagents
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index bdc42b7c03c..8e9248ea81a 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -420,7 +420,7 @@ var/const/INJECT = 5 //injection
for(var/_reagent in cached_reagents)
var/datum/reagent/R = _reagent
if(R.id == reagent)
- if(my_atom && istype(my_atom, /mob/living))
+ if(my_atom && isliving(my_atom))
var/mob/living/M = my_atom
R.on_mob_delete(M)
qdel(R)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 7279ec41475..79072028c9a 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -8,6 +8,7 @@
use_power = 1
idle_power_usage = 40
interact_offline = 1
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/energy = 100
var/max_energy = 100
var/amount = 30
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index aa4955e7ef1..a4af808cbb2 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -6,6 +6,7 @@
icon_state = "mixer0b"
use_power = 1
idle_power_usage = 40
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/weapon/reagent_containers/beaker = null
var/target_temperature = 300
var/heater_coefficient = 0.10
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 07042c5e1ad..52dccdedcd8 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -7,6 +7,7 @@
icon_state = "mixer0"
use_power = 1
idle_power_usage = 20
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/bottle = null
var/mode = 1
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 9fd265af203..448de75f0b6 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -8,6 +8,7 @@
circuit = /obj/item/weapon/circuitboard/computer/pandemic
use_power = 1
idle_power_usage = 20
+ resistance_flags = ACID_PROOF
var/temp_html = ""
var/wait = null
var/obj/item/weapon/reagent_containers/beaker = null
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 479a2ea140b..cc6a21adf5a 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -9,6 +9,7 @@
idle_power_usage = 5
active_power_usage = 100
pass_flags = PASSTABLE
+ resistance_flags = ACID_PROOF
var/operating = 0
var/obj/item/weapon/reagent_containers/beaker = null
var/limit = 10
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index de0b529b446..c8db6407aba 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -54,7 +54,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
return
/datum/reagent/consumable/ethanol/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with ethanol isn't quite as good as fuel.
- if(!istype(M, /mob/living))
+ if(!isliving(M))
return
if(method in list(TOUCH, VAPOR, PATCH))
@@ -680,7 +680,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 60
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/M)
- if( ( istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || istype(M, /mob/living/carbon/monkey) )
+ if((ishuman(M) && M.job in list("Clown") ) || ismonkey(M))
M.heal_bodypart_damage(1,1, 0)
. = 1
return ..() || .
@@ -694,7 +694,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 59 //Proof that clowns are better than mimes right here
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/M)
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(ishuman(M) && M.job in list("Mime"))
M.heal_bodypart_damage(1,1)
. = 1
return ..() || .
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index 3c0e289f6da..42621f1a7fc 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -25,10 +25,10 @@
return 0 //the dead, and blob mobs, don't cause reactions
return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
-/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause) //when the blob takes damage, do this
+/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) //when the blob takes damage, do this
return damage
-/datum/reagent/blob/proc/death_reaction(obj/structure/blob/B, cause) //when a blob dies, do this
+/datum/reagent/blob/proc/death_reaction(obj/structure/blob/B, damage_flag) //when a blob dies, do this
return
/datum/reagent/blob/proc/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T) //when the blob expands, do this
@@ -59,15 +59,14 @@
reac_volume = ..()
M.apply_damage(0.7*reac_volume, BRUTE)
-/datum/reagent/blob/replicating_foam/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
+/datum/reagent/blob/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
var/effectivedamage = damage
if(damage_type == BRUTE)
effectivedamage = damage * 2
- if(damage_type == BURN && effectivedamage > 0 && original_health - effectivedamage > 0 && prob(60))
+ if(damage_type == BURN && effectivedamage > 0 && B.obj_integrity - effectivedamage > 0 && prob(60))
var/obj/structure/blob/newB = B.expand(null, null, 0)
if(newB)
- newB.health = original_health - effectivedamage
- newB.check_health(cause)
+ newB.obj_integrity = B.obj_integrity - effectivedamage
newB.update_icon()
return effectivedamage
@@ -95,8 +94,8 @@
newB.forceMove(get_turf(B))
B.forceMove(T)
-/datum/reagent/blob/shifting_fragments/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(cause && damage > 0 && original_health - damage > 0 && prob(60-damage))
+/datum/reagent/blob/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
var/list/blobstopick = list()
for(var/obj/structure/blob/OB in orange(1, B))
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id)
@@ -134,8 +133,8 @@
/datum/reagent/blob/blazing_oil/extinguish_reaction(obj/structure/blob/B)
B.take_damage(rand(1, 3), BURN)
-/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(cause && damage_type == BURN)
+/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage_type == BURN && (damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser"))
for(var/turf/open/T in range(1, B))
var/obj/structure/blob/C = locate() in T
if(!(C && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) && prob(80))
@@ -200,8 +199,8 @@
O.add_points(points)
O << "Gained [points] resources from the zombification of [M]."
-/datum/reagent/blob/zombifying_pods/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause) && damage <= 20 && original_health - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
+/datum/reagent/blob/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
B.visible_message("A spore floats free of the blob!")
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
@@ -236,8 +235,8 @@
if(M)
M.apply_damage(0.6*reac_volume, OXY)
-/datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause) && original_health - damage <= 0 && prob(10))
+/datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
spark_system.set_up(rand(2, 4), 0, B)
spark_system.start()
return ..()
@@ -247,7 +246,7 @@
/datum/reagent/blob/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
var/damage = rand(30, 50) - severity * rand(10, 15)
- B.take_damage(damage, BURN)
+ B.take_damage(damage, BURN, "energy")
//does aoe brute damage when hitting targets, is immune to explosions
/datum/reagent/blob/explosive_lattice
@@ -278,12 +277,11 @@
else
M.apply_damage(0.6*reac_volume, BRUTE)
-/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(isnull(cause))
- if(damage_type == BRUTE)
- return 0 //no-sell the explosion we do not take damage
- if(damage_type == BURN)
- return damage * 1.5 //take more from fire, tesla, and flashbangs
+/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage_flag == "bomb")
+ return 0
+ else if(damage_flag != "melee" || damage_flag != "bullet" || damage_flag != "laser")
+ return damage * 1.5
return ..()
//does brute, burn, and toxin damage, and cools targets down
@@ -334,7 +332,7 @@
if(M)
M.apply_damage(reac_volume, BURN)
-/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
+/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BRUTE) //take full brute
switch(B.brute_resist)
if(0.5)
@@ -345,8 +343,8 @@
return damage * 10
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
-/datum/reagent/blob/electromagnetic_web/death_reaction(obj/structure/blob/B, cause)
- if(cause)
+/datum/reagent/blob/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
+ if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it
//does brute damage, bonus damage for each nearby blob, and spreads damage out
@@ -371,15 +369,15 @@
B.blob_attack_animation(M) //show them they're getting a bad time
M.apply_damage(0.3*reac_volume, BRUTE)
-/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause)) //the cause isn't fire or bombs, so split the damage
+/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //if it doesn't have the same chemical or is a core or node, don't split damage to it
damagesplit += 1
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //only hurt blobs that have the same overmind chemical and aren't cores or nodes
- C.take_damage(damage/damagesplit, CLONE, B, 0)
+ C.take_damage(damage/damagesplit, CLONE, 0, 0)
return damage / damagesplit
else
return damage * 1.25
@@ -402,9 +400,9 @@
return 0 //the dead, and blob mobs, don't cause reactions
M.adjustBruteLoss(0.8*reac_volume)
-/datum/reagent/blob/reactive_spines/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(damage && damage_type == BRUTE && original_health - damage > 0) //is there any damage, is it brute, and will we be alive
- if(isliving(cause))
+/datum/reagent/blob/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
+ if(damage_flag == "melee")
B.visible_message("The blob retaliates, lashing out!")
for(var/atom/A in range(1, B))
A.blob_act(B)
@@ -437,13 +435,13 @@
if(M)
M.adjustStaminaLoss(0.2*reac_volume)
-/datum/reagent/blob/pressurized_slime/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(cause || damage_type != BURN)
+/datum/reagent/blob/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
extinguisharea(B, damage)
return ..()
-/datum/reagent/blob/pressurized_slime/death_reaction(obj/structure/blob/B, cause)
- if(!isnull(cause))
+/datum/reagent/blob/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
+ if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
B.visible_message("The blob ruptures, spraying the area with liquid!")
extinguisharea(B, 50)
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 122e8840c81..12b2a5bff66 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -94,7 +94,7 @@
color = "#863333" // rgb: 175, 175, 0
/datum/reagent/consumable/banana/on_mob_life(mob/living/M)
- if( ( istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || istype(M, /mob/living/carbon/monkey) )
+ if((ishuman(M) && M.job in list("Clown") ) || ismonkey(M))
M.heal_bodypart_damage(1,1, 0)
. = 1
..()
@@ -105,7 +105,7 @@
description = "Absolutely nothing."
/datum/reagent/consumable/nothing/on_mob_life(mob/living/M)
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(ishuman(M) && M.job in list("Mime"))
M.heal_bodypart_damage(1,1, 0)
. = 1
..()
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 939f77472cf..50058e1d230 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -12,7 +12,7 @@
/datum/reagent/drug/space_drugs/on_mob_life(mob/living/M)
M.set_drugginess(15)
- if(isturf(M.loc) && !istype(M.loc, /turf/open/space))
+ if(isturf(M.loc) && !isspaceturf(M.loc))
if(M.canmove)
if(prob(10)) step(M, pick(cardinal))
if(prob(7))
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 643592ac50a..f5ec6ddb78b 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -161,7 +161,7 @@
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(15,30))
if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades!
- if(istype(T, /turf/open))
+ if(isopenturf(T))
var/turf/open/OT = T
OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=10, wet_time_to_add=reac_volume) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit.
@@ -173,7 +173,7 @@
color = "#B31008" // rgb: 179, 16, 8
/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
- if(!istype(M, /mob/living/carbon/human) && !istype(M, /mob/living/carbon/monkey))
+ if(!ishuman(M) && !ismonkey(M))
return
var/mob/living/carbon/victim = M
@@ -193,7 +193,7 @@
safe_thing = victim.wear_mask
//only humans can have helmets and glasses
- if(istype(victim, /mob/living/carbon/human))
+ if(ishuman(victim))
var/mob/living/carbon/human/H = victim
if( H.head )
if ( H.head.flags_cover & MASKCOVERSEYES )
@@ -324,7 +324,7 @@
color = "#FF00FF" // rgb: 255, 0, 255
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/M)
- if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
+ if(ishuman(M) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
M.heal_bodypart_damage(1,1, 0)
. = 1
..()
@@ -392,7 +392,7 @@
color = "#FFFFFF" // rgb: 0, 0, 0
/datum/reagent/consumable/flour/reaction_turf(turf/T, reac_volume)
- if(!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/flour(T)
reagentdecal.reagents.add_reagent("flour", reac_volume)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 7dc3b698f84..8aed11ceb15 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -119,21 +119,23 @@
M.apply_water()
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/open/space))
+ if(hotspot && !isspaceturf(T))
if(T.air)
var/datum/gas_mixture/G = T.air
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
+ var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
+ if(A)
+ A.acid_level = max(A.acid_level - reac_volume*50, 0)
/*
* Water reaction to an object
*/
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
- if(istype(O))
- O.extinguish()
-
+ O.extinguish()
+ O.acid_level = 0
// Monkey cube
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
@@ -270,7 +272,7 @@
overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle.
/datum/reagent/spraytan/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
if(method == PATCH || method == VAPOR)
var/mob/living/carbon/human/N = M
if(N.dna.species.id == "human")
@@ -335,7 +337,7 @@
/datum/reagent/spraytan/overdose_process(mob/living/M)
metabolization_rate = 1 * REAGENTS_METABOLISM
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/N = M
if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair
N.skin_tone = "orange"
@@ -346,52 +348,167 @@
N.regenerate_icons()
if(prob(7))
if(N.w_uniform)
- M.visible_message(pick("[M]'s collar pops up without warning.", "[M] flexes [M.their_pronoun()] arms."))
+ M.visible_message(pick("[M]'s collar pops up without warning.", "[M] flexes [M.p_their()] arms."))
else
- M.visible_message("[M] [M.their_pronoun()] their arms.")
+ M.visible_message("[M] [M.p_their()] their arms.")
if(prob(10))
M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you."))
..()
return
-/datum/reagent/slimetoxin
- name = "Mutation Toxin"
- id = "mutationtoxin"
- description = "A corruptive toxin produced by slimes."
- color = "#13BC5E" // rgb: 19, 188, 94
-
-/datum/reagent/unstableslimetoxin
- name = "Unstable Mutation Toxin"
- id = "unstablemutationtoxin"
- description = "An unstable and unpredictable corruptive toxin produced by slimes."
+/datum/reagent/stableslimetoxin
+ name = "Stable Mutation Toxin"
+ id = "stablemutationtoxin"
+ description = "A humanizing toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY //So it instantly removes all of itself
+ var/datum/species/race = /datum/species/human
+ var/mutationtext = "The pain subsides. You feel... human."
-/datum/reagent/unstableslimetoxin/on_mob_life(mob/living/carbon/human/H)
+/datum/reagent/stableslimetoxin/on_mob_life(mob/living/carbon/human/H)
..()
H << "You crumple in agony as your flesh wildly morphs into new forms!"
- H.visible_message("[H] falls to the ground and screams as [H.their_pronoun()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
+ H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
H.Weaken(3, 0)
spawn(30)
if(!H || qdeleted(H))
return
- var/list/possible_morphs = list()
- for(var/type in subtypesof(/datum/species))
- var/datum/species/S = type
- if(initial(S.blacklisted))
- continue
- possible_morphs += S
var/current_species = H.dna.species.type
- var/datum/species/mutation = pick(possible_morphs)
+ var/datum/species/mutation = race
if(mutation && mutation != current_species)
- H << "The pain subsides. You feel... different."
+ H << mutationtext
H.set_species(mutation)
else
H << "The pain vanishes suddenly. You feel no different."
return 1
+/datum/reagent/stableslimetoxin/classic //The one from plasma on green slimes
+ name = "Mutation Toxin"
+ id = "mutationtoxin"
+ description = "A corruptive toxin produced by slimes."
+ color = "#13BC5E" // rgb: 19, 188, 94
+ race = /datum/species/jelly/slime
+ mutationtext = "The pain subsides. Your whole body feels like slime."
+
+/datum/reagent/stableslimetoxin/lizard
+ name = "Lizard Mutation Toxin"
+ id = "lizardmutationtoxin"
+ description = "A lizarding toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/lizard
+ mutationtext = "The pain subsides. You feel... scaly."
+
+/datum/reagent/stableslimetoxin/fly
+ name = "Fly Mutation Toxin"
+ id = "flymutationtoxin"
+ description = "An insectifying toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/fly
+ mutationtext = "The pain subsides. You feel... buzzy."
+
+/datum/reagent/stableslimetoxin/pod
+ name = "Podperson Mutation Toxin"
+ id = "podmutationtoxin"
+ description = "A vegetalizing toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/pod
+ mutationtext = "The pain subsides. You feel... plantlike."
+
+/datum/reagent/stableslimetoxin/jelly
+ name = "Imperfect Mutation Toxin"
+ id = "jellymutationtoxin"
+ description = "An jellyfying toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/jelly
+ mutationtext = "The pain subsides. You feel... wobbly."
+
+/datum/reagent/stableslimetoxin/golem
+ name = "Golem Mutation Toxin"
+ id = "golemmutationtoxin"
+ description = "A crystal toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/golem/random
+ mutationtext = "The pain subsides. You feel... rocky."
+
+/datum/reagent/stableslimetoxin/abductor
+ name = "Abductor Mutation Toxin"
+ id = "abductormutationtoxin"
+ description = "An alien toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/abductor
+ mutationtext = "The pain subsides. You feel... alien."
+
+/datum/reagent/stableslimetoxin/android
+ name = "Android Mutation Toxin"
+ id = "androidmutationtoxin"
+ description = "A robotic toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/android
+ mutationtext = "The pain subsides. You feel... artificial."
+
+
+//BLACKLISTED RACES
+/datum/reagent/stableslimetoxin/skeleton
+ name = "Skeleton Mutation Toxin"
+ id = "skeletonmutationtoxin"
+ description = "A scary toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/skeleton
+ mutationtext = "The pain subsides. You feel... spooky."
+
+/datum/reagent/stableslimetoxin/zombie
+ name = "Zombie Mutation Toxin"
+ id = "zombiemutationtoxin"
+ description = "An undead toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past.
+ mutationtext = "The pain subsides. You feel... undead."
+
+/datum/reagent/stableslimetoxin/ash
+ name = "Ash Mutation Toxin"
+ id = "ashmutationtoxin"
+ description = "An ashen toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/lizard/ashwalker
+ mutationtext = "The pain subsides. You feel... savage."
+
+
+//DANGEROUS RACES
+/datum/reagent/stableslimetoxin/shadow
+ name = "Shadow Mutation Toxin"
+ id = "shadowmutationtoxin"
+ description = "A dark toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/shadow
+ mutationtext = "The pain subsides. You feel... darker."
+
+/datum/reagent/stableslimetoxin/plasma
+ name = "Plasma Mutation Toxin"
+ id = "plasmamutationtoxin"
+ description = "A plasma-based toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/plasmaman
+ mutationtext = "The pain subsides. You feel... flammable."
+
+/datum/reagent/stableslimetoxin/unstable //PSYCH
+ name = "Unstable Mutation Toxin"
+ id = "unstablemutationtoxin"
+ description = "An unstable and unpredictable corruptive toxin produced by slimes."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ mutationtext = "The pain subsides. You feel... different."
+
+/datum/reagent/stableslimetoxin/unstable/on_mob_life(mob/living/carbon/human/H)
+ var/list/possible_morphs = list()
+ for(var/type in subtypesof(/datum/species))
+ var/datum/species/S = type
+ if(initial(S.blacklisted))
+ continue
+ possible_morphs += S
+ race = pick(possible_morphs)
+ ..()
+
/datum/reagent/mulligan
name = "Mulligan Toxin"
id = "mulligan"
@@ -500,7 +617,7 @@
color = "#484848" // rgb: 72, 72, 72
/datum/reagent/mercury/on_mob_life(mob/living/M)
- if(M.canmove && istype(M.loc, /turf/open/space))
+ if(M.canmove && isspaceturf(M.loc))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -522,7 +639,7 @@
color = "#1C1300" // rgb: 30, 20, 0
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
- if(!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
var/obj/effect/decal/cleanable/dirt/D = locate() in T.contents
if(!D)
new /obj/effect/decal/cleanable/dirt(T)
@@ -573,7 +690,7 @@
color = "#808080" // rgb: 128, 128, 128
/datum/reagent/lithium/on_mob_life(mob/living/M)
- if(M.canmove && istype(M.loc, /turf/open/space))
+ if(M.canmove && isspaceturf(M.loc))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -598,7 +715,7 @@
/datum/reagent/radium/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 3)
- if(!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
var/obj/effect/decal/cleanable/greenglow/GG = locate() in T.contents
if(!GG)
GG = new/obj/effect/decal/cleanable/greenglow(T)
@@ -635,7 +752,7 @@
..()
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
- if(!istype(M, /mob/living))
+ if(!isliving(M))
return
if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them.
if(holder && holder.chem_temp < 100) // COLD iron.
@@ -657,7 +774,7 @@
color = "#D0D0D0" // rgb: 208, 208, 208
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
- if(!istype(M, /mob/living))
+ if(!isliving(M))
return
if(M.has_bane(BANE_SILVER))
M.reagents.add_reagent("toxin", reac_volume)
@@ -676,7 +793,7 @@
/datum/reagent/uranium/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 3)
- if(!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
var/obj/effect/decal/cleanable/greenglow/GG = locate() in T.contents
if(!GG)
GG = new/obj/effect/decal/cleanable/greenglow(T)
@@ -703,7 +820,7 @@
color = "#660000" // rgb: 102, 0, 0
/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite!
- if(!istype(M, /mob/living))
+ if(!isliving(M))
return
if(method == TOUCH || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 10)
@@ -741,7 +858,7 @@
if(method == TOUCH || method == VAPOR)
if(iscarbon(M))
var/mob/living/carbon/C = M
- if(istype(M,/mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index d2958b475da..5c8d19cb960 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -7,7 +7,7 @@
color = "#550000"
/datum/reagent/thermite/reaction_turf(turf/T, reac_volume)
- if(reac_volume >= 1 && istype(T, /turf/closed/wall))
+ if(reac_volume >= 1 && iswallturf(T))
var/turf/closed/wall/Wall = T
if(istype(Wall, /turf/closed/wall/r_wall))
Wall.thermite = Wall.thermite+(reac_volume*2.5)
@@ -54,17 +54,17 @@
var/turf/open/floor/plating/F = T
if(prob(10 + F.burnt + 5*F.broken)) //broken or burnt plating is more susceptible to being destroyed
F.ChangeTurf(F.baseturf)
- if(istype(T, /turf/open/floor/))
+ if(isfloorturf(T))
var/turf/open/floor/F = T
if(prob(reac_volume))
F.make_plating()
else if(prob(reac_volume))
F.burn_tile()
- if(istype(F, /turf/open/floor/))
+ if(isfloorturf(F))
for(var/turf/turf in range(1,F))
if(!locate(/obj/effect/hotspot) in turf)
PoolOrNew(/obj/effect/hotspot, F)
- if(istype(T, /turf/closed/wall/))
+ if(iswallturf(T))
var/turf/closed/wall/W = T
if(prob(reac_volume))
W.ChangeTurf(/turf/open/floor/plating)
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 69255dee31c..f6da5758e77 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -74,7 +74,7 @@
return
/datum/reagent/toxin/plasma/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with plasma is stronger than fuel!
- if(!istype(M, /mob/living))
+ if(!isliving(M))
return
if(method == TOUCH || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 5)
@@ -520,12 +520,12 @@
M.adjustOxyLoss(rand(5,25), 0)
. = 1
if(3)
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
if(H.stat == CONSCIOUS)
- H.visible_message("[H] clutches at [H.their_pronoun()] chest as if [H.their_pronoun()] heart stopped!")
+ H.visible_message("[H] clutches at [H.p_their()] chest as if [H.p_their()] heart stopped!")
else
H.losebreath += 10
H.adjustOxyLoss(rand(5,25), 0)
@@ -679,7 +679,7 @@
if(method == INJECT)
C.adjustBruteLoss(1.5 * min(6*toxpwr, reac_volume * toxpwr))
return
- C.acid_act(acidpwr, toxpwr, reac_volume)
+ C.acid_act(acidpwr, reac_volume)
/datum/reagent/toxin/acid/reaction_obj(obj/O, reac_volume)
if(istype(O.loc, /mob)) //handled in human acid_act()
@@ -691,8 +691,7 @@
if (!istype(T))
return
reac_volume = round(reac_volume,0.1)
- for(var/obj/O in T)
- O.acid_act(acidpwr, reac_volume)
+ T.acid_act(acidpwr, reac_volume)
/datum/reagent/toxin/acid/fluacid
name = "Fluorosulfuric acid"
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index ee027a5d23b..f3e46619d71 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -107,6 +107,98 @@
required_reagents = list("carbon" = 1, "oxygen" = 2)
required_temp = 777 // pure carbon isn't especially reactive.
+////////////////////////////////// Mutation Toxins ///////////////////////////////////
+
+/datum/chemical_reaction/stable_mutation_toxin
+ name = "Stable Mutation Toxin"
+ id = "stablemutationtoxin"
+ results = list("stablemutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "blood" = 1) //classic
+
+/datum/chemical_reaction/lizard_mutation_toxin
+ name = "Lizard Mutation Toxin"
+ id = "lizardmutationtoxin"
+ results = list("lizardmutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "radium" = 1) //mutant
+
+/datum/chemical_reaction/fly_mutation_toxin
+ name = "Fly Mutation Toxin"
+ id = "flymutationtoxin"
+ results = list("flymutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "mutagen" = 1) //VERY mutant
+
+/datum/chemical_reaction/jelly_mutation_toxin
+ name = "Imperfect Mutation Toxin"
+ id = "jellymutationtoxin"
+ results = list("jellymutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "slimejelly" = 1) //why would you even make this
+
+/datum/chemical_reaction/abductor_mutation_toxin
+ name = "Abductor Mutation Toxin"
+ id = "abductormutationtoxin"
+ results = list("abductormutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "morphine" = 1)
+
+/datum/chemical_reaction/android_mutation_toxin
+ name = "Android Mutation Toxin"
+ id = "androidmutationtoxin"
+ results = list("androidmutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "teslium" = 1) //beep boop
+
+/datum/chemical_reaction/pod_mutation_toxin
+ name = "Podperson Mutation Toxin"
+ id = "podmutationtoxin"
+ results = list("podmutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "eznutriment" = 1) //plant food
+
+/datum/chemical_reaction/golem_mutation_toxin
+ name = "Golem Mutation Toxin"
+ id = "golemmutationtoxin"
+ results = list("golemmutationtoxin" = 1)
+ required_reagents = list("unstablemutationtoxin" = 1, "silver" = 1) //not too hard to get but also not just there in xenobio
+
+
+//BLACKLISTED RACES
+/datum/chemical_reaction/skeleton_mutation_toxin
+ name = "Skeleton Mutation Toxin"
+ id = "skeletonmutationtoxin"
+ results = list("skeletonmutationtoxin" = 1)
+ required_reagents = list("amutationtoxin" = 1, "milk" = 1) //good for yer bones
+
+/datum/chemical_reaction/zombie_mutation_toxin
+ name = "Zombie Mutation Toxin"
+ id = "zombiemutationtoxin"
+ results = list("zombiemutationtoxin" = 1)
+ required_reagents = list("amutationtoxin" = 1, "toxin" = 1)
+
+/datum/chemical_reaction/ash_mutation_toxin //ash lizard
+ name = "Ash Mutation Toxin"
+ id = "ashmutationtoxin"
+ results = list("ashmutationtoxin" = 1)
+ required_reagents = list("amutationtoxin" = 1, "lizardmutationtoxin" = 1, "ash" = 1)
+
+
+//DANGEROUS RACES
+/datum/chemical_reaction/plasma_mutation_toxin
+ name = "Plasma Mutation Toxin"
+ id = "plasmamutationtoxin"
+ results = list("plasmamutationtoxin" = 1)
+ required_reagents = list("skeletonmutationtoxin" = 1, "plasma" = 1, "uranium" = 1) //this is very fucking powerful, so it's hard to make
+
+/datum/chemical_reaction/shadow_mutation_toxin
+ name = "Shadow Mutation Toxin"
+ id = "shadowmutationtoxin"
+ results = list("shadowmutationtoxin" = 1)
+ required_reagents = list("amutationtoxin" = 1, "liquid_dark_matter" = 1, "holywater" = 1)
+
+//Technically a mutation toxin
+/datum/chemical_reaction/mulligan
+ name = "Mulligan"
+ id = "mulligan"
+ results = list("mulligan" = 1)
+ required_reagents = list("humanmutationtoxin" = 1, "mutagen" = 1)
+
+
////////////////////////////////// VIROLOGY //////////////////////////////////////////
/datum/chemical_reaction/virus_food
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 9831f73bc60..b126e44344b 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -233,6 +233,17 @@
P.loc = get_turf(holder.my_atom)
+/datum/chemical_reaction/slimefoam
+ name = "Slime Foam"
+ id = "m_foam"
+ results = list("fluorosurfactant" = 20, "water" = 20)
+ required_reagents = list("water" = 5)
+ required_container = /obj/item/slime_extract/blue
+ required_other = 1
+
+/datum/chemical_reaction/slimefoam/on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+
//Dark Blue
/datum/chemical_reaction/slimefreeze
@@ -289,15 +300,27 @@
feedback_add_details("slime_cores_used","[type]")
var/turf/TU = get_turf(holder.my_atom)
TU.visible_message("The slime extract begins to vibrate adorably!")
- addtimer(src, "burn", 50, FALSE, holder)
+ addtimer(src, "slime_burn", 50, FALSE, holder)
-/datum/chemical_reaction/slimefire/proc/burn(datum/reagents/holder)
+/datum/chemical_reaction/slimefire/proc/slime_burn(datum/reagents/holder)
if(holder && holder.my_atom)
var/turf/open/T = get_turf(holder.my_atom)
if(istype(T))
T.atmos_spawn_air("plasma=50;TEMP=1000")
+
+/datum/chemical_reaction/slimesmoke
+ name = "Slime Smoke"
+ id = "m_smoke"
+ results = list("phosphorus" = 10, "potassium" = 10, "sugar" = 10)
+ required_reagents = list("water" = 5)
+ required_container = /obj/item/slime_extract/orange
+ required_other = 1
+
+/datum/chemical_reaction/slimesmoke/on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+
//Yellow
/datum/chemical_reaction/slimeoverload
@@ -480,6 +503,18 @@
if(holder && holder.my_atom)
explosion(get_turf(holder.my_atom), 1 ,3, 6)
+
+/datum/chemical_reaction/slimecornoil
+ name = "Slime Corn Oil"
+ id = "m_cornoil"
+ results = list("cornoil" = 10)
+ required_reagents = list("blood" = 1)
+ required_container = /obj/item/slime_extract/oil
+ required_other = 1
+
+/datum/chemical_reaction/slimecornoil/on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+
//Light Pink
/datum/chemical_reaction/slimepotion2
name = "Slime Potion 2"
@@ -549,7 +584,6 @@
P.loc = get_turf(holder.my_atom)
-
/datum/chemical_reaction/slime_territory
name = "Slime Territory"
id = "s_territory"
@@ -625,6 +659,22 @@
if(P)
P.loc = get_turf(holder.my_atom)
+
+/datum/chemical_reaction/slimecrayon
+ name = "Slime Crayon"
+ id = "s_crayon"
+ required_reagents = list("blood" = 1)
+ required_container = /obj/item/slime_extract/pyrite
+ required_other = 1
+
+/datum/chemical_reaction/slimecrayon/on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+ var/list/crayons = difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))
+ var/chosen = pick(crayons)
+ var/obj/P = new chosen
+ if(P)
+ P.loc = get_turf(holder.my_atom)
+
//Rainbow :o)
/datum/chemical_reaction/slimeRNG
name = "Random Core"
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 1c54b6f22ce..3c98b775e44 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -62,7 +62,7 @@
else if(C.is_mouth_covered(mask_only = 1))
covered = "mask"
if(covered)
- var/who = (isnull(user) || eater == user) ? "your" : "[eater.their_pronoun()]"
+ var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]"
user << "You have to remove [who] [covered] first!"
return 0
return 1
@@ -73,7 +73,7 @@
R.on_ex_act()
..()
-/obj/item/weapon/reagent_containers/fire_act()
+/obj/item/weapon/reagent_containers/fire_act(exposed_temperature, exposed_volume)
reagents.chem_temp += 30
reagents.handle_reactions()
..()
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 735d0e13cca..a9057ac6f19 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -74,7 +74,7 @@ Borg Hypospray
R.add_reagent(reagent, 30)
/obj/item/weapon/reagent_containers/borghypo/proc/regenerate_reagents()
- if(isrobot(src.loc))
+ if(iscyborg(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
for(var/i in 1 to reagent_ids.len)
@@ -162,7 +162,7 @@ Borg Shaker
return //Can't inject stuff with a shaker, can we? //not with that attitude
/obj/item/weapon/reagent_containers/borghypo/borgshaker/regenerate_reagents()
- if(isrobot(src.loc))
+ if(iscyborg(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
for(var/i in modes) //Lots of reagents in this one, so it's best to regenrate them all at once to keep it from being tedious.
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 8bd874837df..61bd6b78ff6 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -19,7 +19,7 @@
update_icon()
/obj/item/weapon/reagent_containers/glass/bottle/update_icon()
- overlays.Cut()
+ cut_overlays()
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]-10")
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 469be2bbbb2..b6edef2315d 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -5,6 +5,7 @@
volume = 50
flags = OPENCONTAINER
spillable = 1
+ resistance_flags = ACID_PROOF
/obj/item/weapon/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
@@ -212,7 +213,7 @@
/obj/item/weapon/reagent_containers/glass/beaker/large/epinephrine
name = "epinephrine reserve tank"
list_reagents = list("epinephrine" = 50)
-
+
/obj/item/weapon/reagent_containers/glass/beaker/synthflesh
list_reagents = list("synthflesh" = 50)
@@ -230,7 +231,8 @@
flags = OPENCONTAINER
flags_inv = HIDEHAIR
slot_flags = SLOT_HEAD
- armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //Weak melee protection, because you can wear it on your head
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 75, acid = 50) //Weak melee protection, because you can wear it on your head
slot_equipment_priority = list( \
slot_back, slot_wear_id,\
slot_w_uniform, slot_wear_suit,\
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index b258903653e..9f959083c00 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -81,7 +81,7 @@
..()
update_icon()
spawn(80)
- if(isrobot(user) && !reagents.total_volume)
+ if(iscyborg(user) && !reagents.total_volume)
var/mob/living/silicon/robot/R = user
if(R.cell.use(100))
reagents.add_reagent_list(list_reagents)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 962649807d4..7cc303bc814 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -6,28 +6,16 @@
density = 1
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
+ obj_integrity = 300
+ max_integrity = 300
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
-/obj/structure/reagent_dispensers/ex_act(severity, target)
- switch(severity)
- if(1)
+/obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(. && obj_integrity > 0)
+ if(tank_volume && (damage_flag == "bullet" || damage_flag == "laser"))
boom()
- return
- if(2)
- if (prob(50))
- boom()
- return
- if(3)
- if (prob(5))
- boom()
- return
- else
- return
-
-/obj/structure/reagent_dispensers/blob_act(obj/structure/blob/B)
- if(prob(50))
- boom()
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers))
@@ -53,21 +41,18 @@
chem_splash(loc, 5, list(reagents))
qdel(src)
+/obj/structure/reagent_dispensers/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!disassembled)
+ boom()
+ else
+ qdel(src)
+
/obj/structure/reagent_dispensers/watertank
name = "water tank"
desc = "A water tank."
icon_state = "water"
-/obj/structure/reagent_dispensers/bullet_act(obj/item/projectile/Proj)
- ..()
- if(tank_volume && istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
- boom()
-
-/obj/structure/reagent_dispensers/watertank/blob_act(obj/structure/blob/B)
- if(prob(50))
- PoolOrNew(/obj/effect/particle_effect/water, loc)
- qdel(src)
-
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."
@@ -80,15 +65,6 @@
icon_state = "fuel"
reagent_id = "welding_fuel"
-/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj)
- ..()
- if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
- var/boom_message = "[key_name_admin(Proj.firer)] triggered a fueltank explosion via projectile."
- bombers += boom_message
- message_admins(boom_message)
- log_game("[key_name(Proj.firer)] triggered a fueltank explosion via projectile.")
- boom()
-
/obj/structure/reagent_dispensers/fueltank/boom()
explosion(get_turf(src), 0, 1, 5, flame_range = 5)
qdel(src)
@@ -99,13 +75,23 @@
/obj/structure/reagent_dispensers/fueltank/ex_act()
boom()
-/obj/structure/reagent_dispensers/fueltank/fire_act()
+/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume)
boom()
/obj/structure/reagent_dispensers/fueltank/tesla_act()
..() //extend the zap
boom()
+/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
+ ..()
+ if(!qdeleted(src)) //wasn't deleted by the projectile's effects.
+ if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
+ var/boom_message = "[key_name_admin(P.firer)] triggered a fueltank explosion via projectile."
+ bombers += boom_message
+ message_admins(boom_message)
+ log_game("[key_name(P.firer)] triggered a fueltank explosion via projectile.")
+ boom()
+
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
if(!reagents.has_reagent("welding_fuel"))
@@ -176,6 +162,8 @@
/obj/structure/reagent_dispensers/beerkeg/blob_act(obj/structure/blob/B)
explosion(src.loc,0,3,5,7,10)
+ if(!qdeleted(src))
+ qdel(src)
/obj/structure/reagent_dispensers/virusfood
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index c6fe91dace4..1969ece4830 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -297,7 +297,7 @@
id = C.id
/obj/item/conveyor_construct/afterattack(atom/A, mob/user, proximity)
- if(!proximity || user.stat || !istype(A, /turf/open/floor) || istype(A, /area/shuttle))
+ if(!proximity || user.stat || !isfloorturf(A) || istype(A, /area/shuttle))
return
var/cdir = get_dir(A, user)
if(A == user.loc)
@@ -321,7 +321,7 @@
id = rand() //this couldn't possibly go wrong
/obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity)
- if(!proximity || user.stat || !istype(A, /turf/open/floor) || istype(A, /area/shuttle))
+ if(!proximity || user.stat || !isfloorturf(A) || istype(A, /area/shuttle))
return
var/found = 0
for(var/obj/machinery/conveyor/C in view())
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 6f41c5fb43b..8982370ff3a 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -11,6 +11,8 @@
density = 0
pressure_resistance = 5*ONE_ATMOSPHERE
level = 2
+ obj_integrity = 200
+ max_integrity = 200
var/ptype = 0
var/dpdir = 0 // directions as disposalpipe
@@ -182,11 +184,11 @@
nicetype = "pipe"
var/turf/T = loc
- if(T.intact && istype(T, /turf/open/floor))
+ if(T.intact && isfloorturf(T))
user << "You can only attach the [nicetype] if the floor plating is removed!"
return
- if(!ispipe && istype(T, /turf/closed/wall))
+ if(!ispipe && iswallturf(T))
user << "You can't build [nicetype]s on walls, only disposal pipes!"
return
diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm
index e31ecf4beff..0389b87fd99 100644
--- a/code/modules/recycling/disposal-structures.dm
+++ b/code/modules/recycling/disposal-structures.dm
@@ -6,6 +6,7 @@
/obj/structure/disposalholder
invisibility = INVISIBILITY_MAXIMUM
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/datum/gas_mixture/gas = null // gas used to flush, will appear at exit point
var/active = 0 // true if the holder is moving, otherwise inactive
dir = 0
@@ -123,6 +124,8 @@
/obj/structure/disposalholder/allow_drop()
return 1
+
+
// Disposal pipes
/obj/structure/disposalpipe
@@ -135,7 +138,9 @@
level = 1 // underfloor only
var/dpdir = 0 // bitmask of pipe directions
dir = 0// dir will contain dominant direction for junction pipes
- var/health = 10 // health points 0-10
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
var/obj/structure/disposalconstruct/stored
@@ -178,22 +183,9 @@
/obj/structure/disposalpipe/Destroy()
var/obj/structure/disposalholder/H = locate() in src
if(H)
- // holder was present
H.active = 0
var/turf/T = src.loc
- if(T.density)
- // deleting pipe is inside a dense turf (wall)
- // this is unlikely, but just dump out everything into the turf in case
-
- for(var/atom/movable/AM in H)
- AM.forceMove(src.loc)
- AM.pipe_eject(0)
- qdel(H)
- return ..()
-
- // otherwise, do normal expel from turf
- else
- expel(H, T, 0)
+ expel(H, T, 0)
return ..()
// returns the direction of the next pipe object, given the entrance dir
@@ -228,7 +220,7 @@
// update the icon_state to reflect hidden status
/obj/structure/disposalpipe/proc/update()
var/turf/T = src.loc
- hide(T.intact && !istype(T,/turf/open/space)) // space never hides pipes
+ hide(T.intact && !isspaceturf(T)) // space never hides pipes
// hide called by levelupdate if turf intact status changes
// change visibility status and force update of icon
@@ -255,72 +247,34 @@
/obj/structure/disposalpipe/proc/expel(obj/structure/disposalholder/H, turf/T, direction)
var/turf/target
+ var/eject_range = 5
+ var/turf/open/floor/floorturf
- if(istype(T, /turf/open/floor)) //intact floor, pop the tile
- var/turf/open/floor/myturf = T
- if(myturf.floor_tile)
- PoolOrNew(myturf.floor_tile, T)
- myturf.make_plating()
+ if(isfloorturf(T)) //intact floor, pop the tile
+ floorturf = T
+ if(floorturf.floor_tile)
+ PoolOrNew(floorturf.floor_tile, T)
+ floorturf.make_plating()
if(direction) // direction is specified
- if(istype(T, /turf/open/space)) // if ended in space, then range is unlimited
+ if(isspaceturf(T)) // if ended in space, then range is unlimited
target = get_edge_target_turf(T, direction)
else // otherwise limit to 10 tiles
target = get_ranged_target_turf(T, direction, 10)
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
- if(H)
- for(var/atom/movable/AM in H)
- AM.forceMove(src.loc)
- AM.pipe_eject(direction)
- AM.throw_at_fast(target, 10, 1)
+ eject_range = 10
- else // no specified direction, so throw in random direction
+ else if(floorturf)
+ target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5))
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
- if(H)
- for(var/atom/movable/AM in H)
- target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5))
- AM.forceMove(src.loc)
- AM.pipe_eject(0)
- AM.throw_at_fast(target, 5, 1)
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ for(var/atom/movable/AM in H)
+ AM.forceMove(src.loc)
+ AM.pipe_eject(direction)
+ if(target)
+ AM.throw_at_fast(target, eject_range, 1)
H.vent_gas(T)
qdel(H)
- return
-
-// call to break the pipe
-// will expel any holder inside at the time
-// then delete the pipe
-// remains : set to leave broken pipe pieces in place
-/obj/structure/disposalpipe/proc/broken(remains = 0)
- if(remains)
- for(var/D in cardinal)
- if(D & dpdir)
- var/obj/structure/disposalpipe/broken/P = new(src.loc)
- P.setDir(D)
-
- src.invisibility = INVISIBILITY_MAXIMUM // make invisible (since we won't delete the pipe immediately)
- var/obj/structure/disposalholder/H = locate() in src
- if(H)
- // holder was present
- H.active = 0
- var/turf/T = src.loc
- if(T.density)
- // broken pipe is inside a dense turf (wall)
- // this is unlikely, but just dump out everything into the turf in case
-
- for(var/atom/movable/AM in H)
- AM.forceMove(src.loc)
- AM.pipe_eject(0)
- qdel(H)
- return
-
- // otherwise, do normal expel from turf
- if(H)
- expel(H, T, 0)
-
- spawn(2) // delete pipe after 2 ticks to ensure expel proc finished
- qdel(src)
// pipe affected by explosion
@@ -330,28 +284,20 @@
var/obj/structure/disposalholder/H = locate() in src
if(H)
H.contents_explosion(severity, target)
-
- switch(severity)
- if(1)
- broken(0)
- return
- if(2)
- health -= rand(5,15)
- healthcheck()
- return
- if(3)
- health -= rand(0,15)
- healthcheck()
- return
+ ..()
-// test health for brokenness
-/obj/structure/disposalpipe/proc/healthcheck()
- if(health < -2)
- broken(0)
- else if(health<1)
- broken(1)
- return
+/obj/structure/disposalpipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 10)
+ return 0
+ . = ..()
+
+/obj/structure/disposalpipe/fire_act(exposed_temperature, exposed_volume)
+ var/turf/T = src.loc
+ if(T && T.intact) //protected from fire when hidden behind a floor.
+ return
+ ..()
+
//attack by item
//weldingtool: unfasten and convert to obj/disposalconstruct
@@ -370,7 +316,7 @@
// check if anything changed over 2 seconds
if(do_after(user,30, target = src))
if(!src || !W.isOn()) return
- Deconstruct()
+ deconstruct()
user << "You slice the disposal pipe."
else
return ..()
@@ -380,20 +326,28 @@
. = 1
// called when pipe is cut with welder
-/obj/structure/disposalpipe/Deconstruct()
- if(stored)
- var/turf/T = loc
- stored.loc = T
- transfer_fingerprints_to(stored)
- stored.setDir(dir)
- stored.density = 0
- stored.anchored = 1
- stored.update_icon()
- ..()
+/obj/structure/disposalpipe/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ if(stored)
+ var/turf/T = loc
+ stored.loc = T
+ transfer_fingerprints_to(stored)
+ stored.setDir(dir)
+ stored.density = 0
+ stored.anchored = 1
+ stored.update_icon()
+ else
+ for(var/D in cardinal)
+ if(D & dpdir)
+ var/obj/structure/disposalpipe/broken/P = new(src.loc)
+ P.setDir(D)
+ qdel(src)
+
/obj/structure/disposalpipe/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct()
// *** TEST verb
//client/verb/dispstop()
@@ -679,11 +633,10 @@
/obj/structure/disposalpipe/broken/New()
..()
update()
- return
// the disposal outlet machine
-/obj/structure/disposalpipe/broken/Deconstruct()
+/obj/structure/disposalpipe/broken/deconstruct()
qdel(src)
/obj/structure/disposaloutlet
diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm
index ab2da6b7189..fd9f6866d58 100644
--- a/code/modules/recycling/disposal-unit.dm
+++ b/code/modules/recycling/disposal-unit.dm
@@ -8,6 +8,9 @@
anchored = 1
density = 1
on_blueprints = TRUE
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
+ obj_integrity = 200
+ max_integrity = 200
var/datum/gas_mixture/air_contents // internal reservoir
var/mode = 1 // mode -1=screws removed 0=off 1=charging 2=charged
var/flush = 0 // true if flush handle is pulled
@@ -54,7 +57,7 @@
/obj/machinery/disposal/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct()
/obj/machinery/disposal/initialize()
// this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
@@ -91,7 +94,7 @@
if(!W.isOn())
return
user << "You slice the floorweld off \the [src]."
- Deconstruct()
+ deconstruct()
return
if(user.a_intent != "harm")
@@ -118,7 +121,7 @@
/obj/machinery/disposal/proc/stuff_mob_in(mob/living/target, mob/living/user)
if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
return
- if(!istype(user.loc, /turf/)) //No magically doing it from inside closets
+ if(!isturf(user.loc)) //No magically doing it from inside closets
return
if(target.buckled || target.has_buckled_mobs())
return
@@ -146,10 +149,6 @@
target.LAssailant = user
update_icon()
-// can breath normally in the disposal
-/obj/machinery/disposal/alter_health()
- return get_turf(src)
-
/obj/machinery/disposal/relaymove(mob/user)
attempt_escape(user)
@@ -195,14 +194,6 @@
*/
interact(user, 0)
-// hostile mob escape from disposals
-/obj/machinery/disposal/attack_animal(mob/living/simple_animal/M)
- if(M.environment_smash)
- M.do_attack_animation(src)
- visible_message("[M.name] smashes \the [src] apart!")
- qdel(src)
- return
-
// eject the contents of the disposal unit
/obj/machinery/disposal/proc/eject()
var/turf/T = get_turf(src)
@@ -265,14 +256,15 @@
H.vent_gas(loc)
qdel(H)
-/obj/machinery/disposal/Deconstruct()
- if(stored)
- var/turf/T = loc
- stored.loc = T
- src.transfer_fingerprints_to(stored)
- stored.anchored = 0
- stored.density = 1
- stored.update_icon()
+/obj/machinery/disposal/deconstruct()
+ if(!(flags & NODECONSTRUCT))
+ if(stored)
+ var/turf/T = loc
+ stored.loc = T
+ src.transfer_fingerprints_to(stored)
+ stored.anchored = 0
+ stored.density = 1
+ stored.update_icon()
..()
//How disposal handles getting a storage dump from a storage object
@@ -516,7 +508,7 @@
if(WEST)
if(AM.loc.x != loc.x-1) return
- if(istype(AM, /obj))
+ if(isobj(AM))
var/obj/O = AM
O.loc = src
else if(istype(AM, /mob))
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 2feff376587..83ec00b423f 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -114,7 +114,6 @@ var/global/list/obj/machinery/message_server/message_servers = list()
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
/obj/machinery/message_server/attack_hand(mob/user)
-// user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few Centcom delays."
user << "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]"
active = !active
update_icon()
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 339d468a7df..156de6e3c46 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -107,5 +107,5 @@
//we eject the loaded item when deconstructing the machine
/obj/machinery/r_n_d/on_deconstruction()
if(loaded_item)
- loaded_item.loc = loc
+ loaded_item.forceMove(loc)
..()
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 7545803b9e0..cfc64d6ab01 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/machines/research.dmi'
icon_state = "server"
var/datum/research/files
- var/health = 100
+ var/heat_health = 100
var/list/id_with_upload = list() //List of R&D consoles with upload to server access.
var/list/id_with_download = list() //List of R&D consoles with download from server access.
var/id_with_upload_string = "" //String versions for easy editing in map editor.
@@ -56,12 +56,12 @@
var/datum/gas_mixture/environment = loc.return_air()
switch(environment.temperature)
if(0 to T0C)
- health = min(100, health + 1)
+ heat_health = min(100, heat_health + 1)
if(T0C to (T20C + 20))
- health = Clamp(health, 0, 100)
+ heat_health = Clamp(heat_health, 0, 100)
if((T20C + 20) to (T0C + 70))
- health = max(0, health - 1)
- if(health <= 0)
+ heat_health = max(0, heat_health - 1)
+ if(heat_health <= 0)
/*griefProtection() This seems to get called twice before running any code that deletes/damages the server or it's files anwyay.
refreshParts and the hasReq procs that get called by this are laggy and do not need to be called by every server on the map every tick */
var/updateRD = 0
@@ -84,18 +84,10 @@
griefProtection()
..()
-
/obj/machinery/r_n_d/server/ex_act(severity, target)
griefProtection()
..()
-
-/obj/machinery/r_n_d/server/blob_act(obj/structure/blob/B)
- griefProtection()
- ..()
-
-
-
//Backup files to centcom to help admins recover data after greifer attacks
/obj/machinery/r_n_d/server/proc/griefProtection()
for(var/obj/machinery/r_n_d/server/centcom/C in machines)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index c42594790e9..8afa443751b 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -194,7 +194,7 @@
SM.mind.enslave_mind_to_creator(user)
SM.sentience_act()
SM << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!"
- SM << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist [user.them_pronoun()] in completing [user.their_pronoun()] goals at any cost."
+ SM << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist [user.p_them()] in completing [user.p_their()] goals at any cost."
user << "[SM] accepts the potion and suddenly becomes attentive and aware. It worked!"
qdel(src)
else
@@ -418,7 +418,7 @@
item_state = "golem"
item_color = "golem"
flags = ABSTRACT | NODROP
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
has_sensor = 0
/obj/item/clothing/suit/golem
@@ -431,7 +431,7 @@
permeability_coefficient = 0.50
body_parts_covered = FULL_BODY
flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = ABSTRACT | NODROP
/obj/item/clothing/shoes/golem
@@ -439,7 +439,7 @@
desc = "sturdy adamantine feet"
icon_state = "golem"
item_state = null
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = NOSLIP | ABSTRACT | NODROP
@@ -449,7 +449,7 @@
icon_state = "golem"
item_state = "golem"
siemens_coefficient = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = ABSTRACT | NODROP
@@ -460,7 +460,7 @@
item_state = null
siemens_coefficient = 0
flags = ABSTRACT | NODROP
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/item/clothing/head/space/golem
@@ -469,7 +469,7 @@
item_color = "dermal"
name = "golem's head"
desc = "a golem's head"
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = ABSTRACT | NODROP
/obj/effect/golemrune
@@ -478,7 +478,7 @@
name = "rune"
icon = 'icons/obj/rune.dmi'
icon_state = "golem"
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
layer = TURF_LAYER
/obj/effect/golemrune/New()
@@ -564,13 +564,13 @@
playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1)
for(var/i in 1 to duration-1)
for(var/atom/A in orange (freezerange, src.loc))
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/M = A
if(M in immune)
continue
M.Stun(10, 1, 1)
M.anchored = 1
- if(istype(M, /mob/living/simple_animal/hostile))
+ if(ishostile(M))
var/mob/living/simple_animal/hostile/H = M
H.AIStatus = AI_OFF
H.LoseTarget()
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index 71ee2153806..96dc4c28bea 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -10,7 +10,7 @@
bound_width = 96
bound_height = 96
pixel_x = -32
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
luminosity = 1
var/boss = FALSE
var/is_anyone_home = FALSE
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index 609f295acbd..a2de405894f 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -20,7 +20,7 @@
user << "No... just one more try..."
user.gib()
else
- user.visible_message("[user] pulls [src]'s lever with a glint in [user.their_pronoun()] eyes!", "You feel a draining as you pull the lever, but you \
+ user.visible_message("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!", "You feel a draining as you pull the lever, but you \
know it'll be worth it.")
icon_state = "slots2"
playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, 0)
@@ -79,7 +79,7 @@
/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
- if(istype(mover, /mob/living/carbon/human))
+ if(ishuman(mover))
var/mob/living/carbon/human/H = mover
if(H.nutrition >= NUTRITION_LEVEL_FAT)
H.visible_message("[H] pushes through [src]!", "You've seen and eaten worse than this.")
@@ -97,7 +97,7 @@
icon_state = "magic_mirror"
/obj/structure/mirror/magic/pride/curse(mob/user)
- user.visible_message("The ground splits beneath [user] as [user.their_pronoun()] hand leaves the mirror!", \
+ user.visible_message("The ground splits beneath [user] as [user.p_their()] hand leaves the mirror!", \
"Perfect. Much better! Now nobody will be able to resist yo-")
var/turf/T = get_turf(user)
T.ChangeTurf(/turf/open/chasm/straight_down)
@@ -123,7 +123,7 @@
return
if(!istype(user))
return
- if(istype(AM, /mob/living/carbon/human))
+ if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if(user.real_name != H.dna.real_name)
user.real_name = H.dna.real_name
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 34be79ef84d..9a90b43541e 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -11,6 +11,7 @@ var/datum/events/keycard_events = new()
active_power_usage = 6
power_channel = ENVIRON
req_access = list(access_keycard_auth)
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/datum/event/ev
var/event = ""
var/obj/machinery/keycard_auth/event_source
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index eb64c406645..0ebc8ef0436 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -12,6 +12,7 @@
var/cooldown = 600
possible_destinations = "ferry_home"
admin_controlled = 1
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
..()
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 76bc75f6128..770a1673ac2 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -8,7 +8,7 @@
//icon = 'icons/dirsquare.dmi'
icon_state = "pinonfar"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
anchored = 1
var/id
@@ -29,12 +29,16 @@
else
return QDEL_HINT_LETMELIVE
+/obj/docking_port/take_damage()
+ return
+
/obj/docking_port/singularity_pull()
return
/obj/docking_port/singularity_act()
return 0
/obj/docking_port/shuttleRotate()
return //we don't rotate with shuttles via this code.
+
//returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle
/obj/docking_port/proc/return_coords(_x, _y, _dir)
if(_dir == null)
@@ -472,7 +476,7 @@
areaInstance.contents += T1
//copy over air
- if(istype(T1, /turf/open))
+ if(isopenturf(T1))
var/turf/open/Ts1 = T1
Ts1.copy_air_with_tile(T0)
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index f018168952c..af697b2336f 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -57,7 +57,8 @@
name = "wabbajack altar"
desc = "Whether you're sleeping or waking, it's going to be \
quite chaotic."
- health = 1000
+ obj_integrity = 1000
+ max_integrity = 1000
verb_say = "chants"
var/obj/machinery/power/emitter/energycannon/magical/our_statue
var/list/mob/living/sleepers = list()
@@ -95,8 +96,7 @@
for(var/i in found - sleepers)
var/mob/living/L = i
L.color = "#800080"
- L.visible_message("A strange purple glow \
- wraps itself around [L] as they suddenly fall unconcious.",
+ L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.",
"[desc]")
// Don't let them sit suround unconscious forever
addtimer(src, "sleeper_dreams", 100, FALSE, L)
@@ -187,7 +187,8 @@
/obj/structure/table/wood/bar
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags = NODECONSTRUCT
- health = 1000
+ obj_integrity = 1000
+ max_integrity = 1000
var/boot_dir = 1
/obj/structure/table/wood/bar/Crossed(atom/movable/AM)
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index 8d993a45c49..c835013866a 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -8,6 +8,7 @@
req_access = list(access_syndicate)
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/machinery/computer/shuttle/syndicate/recall
name = "syndicate shuttle recall terminal"
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index c8ad0935759..c4f20f931b9 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -249,9 +249,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(overlay)
for(var/atom/target in targets)
var/location
- if(istype(target,/mob/living))
+ if(isliving(target))
location = target.loc
- else if(istype(target,/turf))
+ else if(isturf(target))
location = target
var/obj/effect/overlay/spell = new /obj/effect/overlay(location)
spell.icon = overlay_icon
@@ -263,11 +263,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/proc/after_cast(list/targets)
for(var/atom/target in targets)
var/location
- if(istype(target,/mob/living))
+ if(isliving(target))
location = target.loc
- else if(istype(target,/turf))
+ else if(isturf(target))
location = target
- if(istype(target,/mob/living) && message)
+ if(isliving(target) && message)
target << text("[message]")
if(sparks_spread)
var/datum/effect_system/spark_spread/sparks = new
diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm
index ebd4933f58d..c97369e774b 100644
--- a/code/modules/spells/spell_types/charge.dm
+++ b/code/modules/spells/spell_types/charge.dm
@@ -18,7 +18,7 @@
var/charged_item = null
var/burnt_out = 0
- if(L.pulling && (istype(L.pulling, /mob/living)))
+ if(L.pulling && isliving(L.pulling))
var/mob/living/M = L.pulling
if(M.mob_spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list)
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index 5aba7f5b5c3..bd91b8ff347 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -78,7 +78,7 @@
density = 0
anchored = 1
invisibility = 60
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/spell_jaunt/Destroy()
// Eject contents if deleted somehow
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index 1cf58b7fd9b..75e9d5642ad 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -80,7 +80,7 @@
lich.real_name = M.mind.name
M.mind.transfer_to(lich)
lich.hardset_dna(null,null,lich.real_name,null,/datum/species/skeleton)
- lich << "Your bones clatter and shutter as they're pulled back into this world!"
+ lich << "Your bones clatter and shutter as you are pulled back into this world!"
charge_max += 600
var/mob/old_body = current_body
var/turf/body_turf = get_turf(old_body)
diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm
index b67415dcfff..6068af33026 100644
--- a/code/modules/spells/spell_types/mind_transfer.dm
+++ b/code/modules/spells/spell_types/mind_transfer.dm
@@ -31,8 +31,11 @@ Also, you never added distance checking after target is selected. I've went ahea
var/mob/living/target = targets[1]
+ var/t_He = target.p_they(TRUE)
+ var/t_is = target.p_are()
+
if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
- user << "They are too far away!"
+ user << "[t_He] [t_is] too far away!"
return
if(ismegafauna(target))
@@ -44,7 +47,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
if(!target.key || !target.mind)
- user << "They appear to be catatonic! Not even magic can affect their vacant mind."
+ user << "[t_He] appear[target.p_s()] to be catatonic! Not even magic can affect [target.p_their()] vacant mind."
return
if(user.suiciding)
@@ -52,7 +55,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
if((target.mind.special_role in protected_roles) || cmptext(copytext(target.key,1,2),"@"))
- user << "Their mind is resisting your spell!"
+ user << "[target.p_their(TRUE)] mind is resisting your spell!"
return
var/mob/living/victim = target//The target of the spell whos body will be transferred to.
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 78790328ea3..b330adcdf9f 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -354,13 +354,13 @@
throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
distfromcaster = get_dist(user, AM)
if(distfromcaster == 0)
- if(istype(AM, /mob/living))
+ if(isliving(AM))
var/mob/living/M = AM
M.Weaken(5)
M.adjustBruteLoss(5)
M << "You're slammed into the floor by [user]!"
else
- if(istype(AM, /mob/living))
+ if(isliving(AM))
var/mob/living/M = AM
M.Weaken(stun_amt)
M << "You're thrown back by [user]!"
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index fdc5247f4aa..352831bbece 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -99,7 +99,7 @@
x_max = x - 6
for(var/turf/T in block(locate(x_min,y-1,z),locate(x_max,y+1,z)))
- if(T.density || istype(T, /turf/open/space))
+ if(T.density || isspaceturf(T))
return FALSE
return TRUE
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 20f5a76f6d4..b82ee24952b 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -139,7 +139,7 @@
/obj/machinery/satellite/meteor_shield/proc/space_los(meteor)
for(var/turf/T in getline(src,meteor))
- if(!istype(T, /turf/open/space))
+ if(!isspaceturf(T))
return FALSE
return TRUE
diff --git a/code/modules/stock_market/stocks.dm b/code/modules/stock_market/stocks.dm
index b75a5e56a16..9969136ec51 100644
--- a/code/modules/stock_market/stocks.dm
+++ b/code/modules/stock_market/stocks.dm
@@ -90,7 +90,7 @@
/datum/stock/proc/frc(amt)
var/shares = available_shares + outside_shareholders * average_shares
var/fr = amt / 100 / shares * fluctuational_coefficient * fluctuation_rate * max(-(current_trend / 100), 1)
- if (fr < 0 && speculation < 0 || fr > 0 && speculation > 0)
+ if ((fr < 0 && speculation < 0) || (fr > 0 && speculation > 0))
fr *= max(abs(speculation) / 5, 1)
else
fr /= max(abs(speculation) / 5, 1)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 8999f6216ff..a2acadb0f93 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -104,7 +104,7 @@
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
-/obj/item/bodypart/proc/take_damage(brute, burn, updating_health = 1)
+/obj/item/bodypart/proc/receive_damage(brute, burn, updating_health = 1)
if(owner && (owner.status_flags & GODMODE))
return 0 //godmode
brute = max(brute * config.damage_multiplier,0)
@@ -345,6 +345,11 @@
return standing
+
+/obj/item/bodypart/deconstruct(disassembled = TRUE)
+ drop_organs()
+ qdel(src)
+
/obj/item/bodypart/chest
name = "chest"
desc = "It's impolite to stare at a person's chest."
@@ -402,6 +407,7 @@
max_damage = 50
body_zone ="l_arm"
body_part = ARM_LEFT
+ held_index = 1
px_x = -6
px_y = 0
@@ -435,6 +441,7 @@
max_damage = 50
body_zone = "r_arm"
body_part = ARM_RIGHT
+ held_index = 2
px_x = 6
px_y = 0
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 7c153342226..17301005738 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -16,7 +16,7 @@
return 0
var/obj/item/bodypart/affecting = C.get_bodypart("chest")
- affecting.take_damage(Clamp(brute_dam/2, 15, 50), Clamp(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage
+ affecting.receive_damage(Clamp(brute_dam/2, 15, 50), Clamp(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage
C.visible_message("[C]'s [src.name] has been violently dismembered!")
C.emote("scream")
drop_limb()
@@ -84,7 +84,7 @@
C.bodyparts -= src
if(held_index)
C.unEquip(owner.get_item_for_held_index(held_index), 1)
- C.hand_bodyparts[held_index] = null
+ C.hand_bodyparts -= src
owner = null
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index c3d86b5d4a2..067788acfcf 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -174,10 +174,6 @@
return standing
-/obj/item/bodypart/head/burn()
- drop_organs()
- ..()
-
/obj/item/bodypart/head/monkey
icon = 'icons/mob/animal_parts.dmi'
icon_state = "default_monkey_head"
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index c07e5208bef..2bbcb36fcc6 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -73,7 +73,7 @@
F.SetLuminosity(0)
owner.unEquip(holder, 1)
- holder.loc = src
+ holder.forceMove(src)
holder = null
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
@@ -84,7 +84,7 @@
holder = item
holder.flags |= NODROP
- holder.resistance_flags |= LAVA_PROOF | UNACIDABLE
+ holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
holder.slot_flags = null
holder.w_class = 5
holder.materials = null
@@ -158,7 +158,8 @@
origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3"
holder = /obj/item/weapon/gun/energy/laser/mounted
-/obj/item/organ/cyberimp/arm/gun/laser/l/zone = "l_arm"
+/obj/item/organ/cyberimp/arm/gun/laser/l
+ zone = "l_arm"
/obj/item/organ/cyberimp/arm/gun/taser
@@ -168,7 +169,8 @@
origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
holder = /obj/item/weapon/gun/energy/gun/advtaser/mounted
-/obj/item/organ/cyberimp/arm/gun/taser/l/zone = "l_arm"
+/obj/item/organ/cyberimp/arm/gun/taser/l
+ zone = "l_arm"
/obj/item/organ/cyberimp/arm/toolset
@@ -178,7 +180,8 @@
contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg,
/obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg)
-/obj/item/organ/cyberimp/arm/toolset/l/zone = "l_arm"
+/obj/item/organ/cyberimp/arm/toolset/l
+ zone = "l_arm"
/obj/item/organ/cyberimp/arm/toolset/emag_act()
if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list))
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 5121e955a1b..8e336ec6494 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -96,7 +96,7 @@
else
cooldown += 200
- if(istype(owner, /mob/living/carbon/human))
+ if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.stat != DEAD && prob(50 / severity))
H.heart_attack = TRUE
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index eef8bf6dfd3..5c14365d981 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -18,7 +18,7 @@
/obj/item/organ/cyberimp/eyes/Insert(var/mob/living/carbon/M, var/special = 0)
..()
- if(istype(owner, /mob/living/carbon/human) && eye_color)
+ if(ishuman(owner) && eye_color)
var/mob/living/carbon/human/HMN = owner
old_eye_color = HMN.eye_color
HMN.eye_color = eye_color
@@ -30,7 +30,7 @@
/obj/item/organ/cyberimp/eyes/Remove(var/mob/living/carbon/M, var/special = 0)
M.sight ^= sight_flags
- if(istype(M,/mob/living/carbon/human) && eye_color)
+ if(ishuman(M) && eye_color)
var/mob/living/carbon/human/HMN = owner
HMN.eye_color = old_eye_color
HMN.regenerate_icons()
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index ed61adba152..0e34e14dc23 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -20,7 +20,7 @@
var/oldname = target.real_name
target.real_name = target.dna.species.random_name(target.gender,1)
var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name
- user.visible_message("[user] alters [oldname]'s appearance completely, they are now [newname]!", "You alter [oldname]'s appearance completely, they are now [newname].")
+ user.visible_message("[user] alters [oldname]'s appearance completely, [target.p_they()] are now [newname]!", "You alter [oldname]'s appearance completely, [target.p_they()] are now [newname].")
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.sec_hud_set_ID()
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index dae2c7092e2..62067171862 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -30,7 +30,7 @@
else
user << "You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!"
return 1 //returns 1 so we don't stab the guy in the dick or wherever.
- if(isrobot(user) && user.a_intent != "harm") //to save asimov borgs a LOT of heartache
+ if(iscyborg(user) && user.a_intent != "harm") //to save asimov borgs a LOT of heartache
return 1
return 0
@@ -50,7 +50,7 @@
prob_chance = implements[implement_type]
prob_chance *= surgery.get_propability_multiplier()
- if(prob(prob_chance) || isrobot(user))
+ if(prob(prob_chance) || iscyborg(user))
if(success(user, target, target_zone, tool, surgery))
advance = 1
else
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 50b73da7bc2..c3e7d9b0c98 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -20,7 +20,7 @@
if(!state)
return
- if(istype(user, /mob/dead/observer))
+ if(isobserver(user))
// If they turn on ghost AI control, admins can always interact.
if(IsAdminGhost(user))
. = max(., UI_INTERACTIVE)
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 4e001cb1680..4058a763519 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -7,6 +7,11 @@
var/obj/item/weapon/storage/bag/trash/mybag = null
var/floorbuffer = 0
+/obj/vehicle/janicart/Destroy()
+ if(mybag)
+ qdel(mybag)
+ mybag = null
+ return ..()
/obj/vehicle/janicart/handle_vehicle_offsets()
..()
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index f21275b6fce..be42e5ef8d9 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -8,6 +8,9 @@
anchored = 0
can_buckle = 1
buckle_lying = 0
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 60, acid = 60)
var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle
var/next_vehicle_move = 0 //used for move delays
var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
@@ -144,3 +147,28 @@
/obj/vehicle/space/Process_Spacemove(direction)
return 1
+
+/obj/vehicle/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 20)
+ return 0
+ . = ..()
+
+/obj/vehicle/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
+/obj/vehicle/examine(mob/user)
+ ..()
+ if(!(resistance_flags & INDESTRUCTIBLE))
+ if(resistance_flags & ON_FIRE)
+ user << "It's on fire!"
+ var/healthpercent = (obj_integrity/max_integrity) * 100
+ switch(healthpercent)
+ if(100 to INFINITY)
+ user << "It seems pristine and undamaged."
+ if(50 to 100)
+ user << "It looks slightly damaged."
+ if(25 to 50)
+ user << "It appears heavily damaged."
+ if(0 to 25)
+ user << "It's falling apart!"
\ No newline at end of file
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index f3f127071a7..c477af9bc64 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -52,12 +52,12 @@
owner.revive(full_heal = TRUE)
switch(old_stat)
if(DEAD, UNCONSCIOUS)
- owner.visible_message("[owner] staggers to [owner.their_pronoun()] feet!")
+ owner.visible_message("[owner] staggers to [owner.p_their()] feet!")
owner << "You stagger to your feet!"
// Conscious conversions will generally only happen for an event
// or for a converts_living=TRUE infection
if(CONSCIOUS)
- owner.visible_message("[owner] suddenly convulses, as [owner.they_pronoun()] gain a ravenous hunger in [owner.their_pronoun()] eyes!",
+ owner.visible_message("[owner] suddenly convulses, as [owner.p_they()] gain a ravenous hunger in [owner.p_their()] eyes!",
"You HUNGER!")
playsound(owner.loc, 'sound/hallucinations/growl3.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time)
diff --git a/code/orphaned_procs/priority_announce.dm b/code/orphaned_procs/priority_announce.dm
index 38e1a24d5d3..1ad4a33f8f4 100644
--- a/code/orphaned_procs/priority_announce.dm
+++ b/code/orphaned_procs/priority_announce.dm
@@ -25,7 +25,7 @@
announcement += " "
for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player) && !M.ear_deaf)
+ if(!isnewplayer(M) && !M.ear_deaf)
M << announcement
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
M << sound(sound)
@@ -45,7 +45,7 @@
return
for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player) && !M.ear_deaf)
+ if(!isnewplayer(M) && !M.ear_deaf)
M << "[title] [message] "
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
if(alert)
diff --git a/code/world.dm b/code/world.dm
index 97242e14e7e..79cf68722b5 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -4,9 +4,13 @@
area = /area/space
view = "15x15"
cache_lifespan = 7
+ hub = "Exadv1.spacestation13"
+ hub_password = "kMZy3U5jJHSiBQjr"
+ name = "/tg/ Station 13"
fps = 20
+ visibility = 0
-var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
+var/list/map_transition_config = MAP_TRANSITION_CONFIG
/world/New()
check_for_cleanbot_bug()
@@ -32,7 +36,6 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
-
load_configuration()
load_mode()
load_motd()
diff --git a/config/admins.txt b/config/admins.txt
index 8be65927ee9..1930f4d68f0 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -120,3 +120,4 @@ SnipeDragon = Game Master
Fjeld = Game Master
kevinz000 = Game Master
TrustyGun = Game Master
+Cyberboss = Game Master
\ No newline at end of file
diff --git a/config/config.txt b/config/config.txt
index 5ea1efcfb79..a8cc323f2ce 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -4,6 +4,9 @@
## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead.
STATIONNAME Space Station 13
+## Put on byond hub: uncomment this to put your server on the byond hub.
+#HUB
+
# Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready.
LOBBY_COUNTDOWN 120
diff --git a/html/changelog.html b/html/changelog.html
index 35cadd978c2..757ce8bb157 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,63 @@
-->
+ 10 October 2016
+ ChemicalRascal updated:
+
+ - Previously, improving the incinerator's efficiency made the RPM decay more quickly, instead of less quickly. No more!
+
+ Cyberboss updated:
+
+ - More reagent containers can be used for filling your dirty vapor cancer sticks
+ - Fixed some vape spelling/grammar
+
+ MrStonedOne updated:
+
+ - Player Preferences window made slightly faster.
+
+ Nanotrasen Stress Relief Board updated:
+
+ - Claymores created through Highlander no longer thirst for blood or announce their wielder's location incessantly.
+ - Claymores should now properly absorb fallen foes' corpses.
+ - Losing a limb now properly destroys your claymore.
+
+ Supermichael777 updated:
+
+ - The wizards federation have instituted a strict 1 demon limit on demon bottles.
+
+ XDTM updated:
+
+ - Using blood on an Oil Slime will create Corn Oil.
+ - Using blood on Pyrite Slimes will create a random crayon.
+ - Using water on Orange Slimes will create a small smoke cloud.
+ - Using water on Blue Slimes will spawn foam.
+ - You can now retrieve materials inserted in a Drone Shell Dispenser with a crowbar.
+
+ phil235 updated:
+
+ - A whole bunch of structures and machines can now be broken and destroyed using conventional attack methods.
+ - The effect of fire on objects is overhauled. When on fire, your external clothes now take fire damage and can become ashes, unless fire proof. All objects caught in a fire can now take fire damage, instead of just flammable ones, unless fire proof.
+ - Acid effect is overhauled. Splashing acid on something puts a green effect on it and start slowly melting it. Throwing acid on mobs puts acid on their clothes. Acid can destroy structures and items alike, as long as they're not acid proof. The more acid put on an object, the faster it melts. Walking on an acid puddle puts acid on your shoes or burns your bare feet. Picking up an item with acid without adequate glove protection burns your hand. Acid can be washed away with any sort of water source (extinguisher, shower, water glass,etc...).
+ - When a mob receives melee attacks, its clothes also get damaged. Clothes with enough damage get a visual effect. Damaged clothes can be repaired with cloth (produced with botany's biogenerator). Clothes that receives too much melee damage become shreds.
+ - Clicking a structure/machine with an item on help intent can never result in an attack.
+ - Hostile animals that are environment destroyers no longer destroys tables&closets in one hit. It now takes several hits depending on the animal.
+
+
+ 07 October 2016
+ WJohnston updated:
+
+ - Improved/resprited AI card, pAI, easel/canvases, shotgun shells, RCD cartridge, speedloaders, and certain older buttons.
+ - Improved/resprited a few bar signs, basketball/dodgeball/hoop, blood bags, and body bags.
+ - Improved/resprited Paper, stamps, folders, small fires, pens, energy daggers, cabinets, newspaper and other bureaucracy related items.
+
+
+ 01 October 2016
+ Incoming5643 updated:
+
+ - After years of having to live on a mostly blown up hunk of junk the wizard's ship has finally been repaired
+ - No one paid attention to that lore anyway
+
+
28 September 2016
Cuboos updated:
@@ -951,173 +1008,6 @@
- Added a new PDA button/app: Drone Phone!
-
- 08 August 2016
- Ergovisavi updated:
-
- - Added bonfires to botany. Requires five tower cap logs to create, and mobs can be buckled to them if an iron rod is added to the bonfire and the mob is restrained.
-
- Joan updated:
-
- - Added the clockcult "Global Records" alert, which clock cultists can mouse over to check a variety of information on the clockcult's status, including living servants, number of caches, CV, tinkerer's daemons, if there's an unconverted AI, what clockwork generals can be invoked, and what scripture is unlocked.
-
- Shadowlight213 updated:
-
- - Ghosts can now see human player's huds when using the OOC -> Observe verb
-
- WJohnston, Gun Hog updated:
-
- - Xenos are now considered female.
- - Hunter pounce are now always blocked by shields, and may be blocked more often by other protective items.
- - Alien Queen is now somewhat faster.
- - Adjusted larva growth sprites.
- - Removed 20% facehugger failure chance for masks.
- - Disarm now always forces a person to drop an item in the active hand, and if a person's hand is empty/undroppable, Disarm will always result in a tackle.
- - Cyborgs disarmed by a Xeno will first disable their selected module, and if there is none selected, the cyborg will be pushed back and stunned.
- - Tail Sweep now has a slightly longer stun.
-
-
- 07 August 2016
- Arctophylax updated:
-
- - You can unbuckle mobs from meat spikes by clicking on the spike once again.
-
- Joan updated:
-
- - Barrier runes will now block air while active.
- - Trying to use sleeping carp against the colossus will now anger it.
-
- frtbngll updated:
-
- - Fixed Paper Wizard summoning only 9 minions in its lifespan by making the dead stickman decrease it's summoned_minions variable
-
- lordpidey updated:
-
- - Centcom has received reports of cyborgs electrocuting themselves when working on the power grid, and we have decided to stop storing important electronics on the wirecutter's blade.
-
-
- 05 August 2016
- Arctophylax updated:
-
- - The Emergency Medical and Winter Wonderland Holodeck programs work once again.
-
- Cruix updated:
-
- - RCDs can no longer place multiple grilles on the same tile.
- - RCDs will no longer use all their ammo if you try to build a wall on the same turf multiple times.
- - RCDs will now inform their user if they do not have enough ammo to complete an operation.
-
- Incoming5643 updated:
-
- - Parrots have been made more robust.
-
- Joan updated:
-
- - Clockwork Constructs, including anima fragments, marauders, and reclaimers, can now communicate over the Hierophant Network.
- - Plasma cutters(normal, advanced, and mech) now have double range in low pressure areas, but slightly lower range in high pressure areas.
- - Vitality Matrices will consume dead non-servant mobs to gain a large amount of Vitality. This doesn't work on mobs that did not have a mind at some point.
-
- Lordpidey and PKPenguin321 updated:
-
- - Recent studies have revealed that fly amanita can give you a huge trip.
-
- Lzimann updated:
-
- - Holy water no longers makes you confused.
-
- ModernViolence updated:
-
- - Photocopier fixes: proper sprites for not empty copies; removing originals now does not delete them
-
- PKPenguin321 updated:
-
- - Chef, do your station a favor and make a home run baseball burger (TM)
-
- Robustin updated:
-
- - The initial supply talisman can now be used to create runed metal, 5 per use
- - The void torch is now available from the altar, use it to transport any item instantly to any cultist! It appears alongside the veil shifter as part of the "Veil Walker" set.
- - Cult floors no longer appear on mesons!
- - Flagellant's Robes now increases damage taken by 50%, down from 100%
- - Veil Shifter has 4 uses, up from 2
- - Shuttle curse now delays shuttle 3 minutes, up from 2.5 minutes
- - Cult forges, archives, and airlocks have had their cost reduced by 1 runed metal each
-
- Shadowlight213 updated:
-
- - You will now receive an achievement for winning a pulse rifle at the arcade.
-
- TheCarlSaganExpress updated:
-
- - Added lighting effects to the welder.
-
-
- 02 August 2016
- CoreOverload updated:
-
-
- 01 August 2016
- Bawhoppen updated:
-
- - Added crowns. Make them from gold. Cap gets a fancy one.
-
- Fox McCloud updated:
-
- - Adds in generic uplink refund system that potentially allows for even regular traitors to refund uplink items
-
- Joan updated:
-
- - Soul Vessels can now be used on unconscious or dead humans to extract their consciousness, much like a soulstone.
- - Soul Vessels no longer automatically ping ghosts when created, though they can still be used in-hand to ping ghosts.
- - Soul Vessels can now communicate over the Hierophant Network
- - Xenobiology golems enslaved to someone will become convertable if their enslaver is converted to the enslaving antag type; this applies to gang and both cult types.
-
- oranges updated:
-
- - Reverted toolboxes fitting in backpacks due to being incorrectly merged
-
-
- 31 July 2016
- Arctophylax updated:
-
- - Birdboat's atmospheric tanks now function normally again.
- - Birdboat's TEG is now orientated to match the pipe layout.
-
- Bawhoppen updated:
-
- - toolboxes fit in backpacks
-
- Gun Hog updated:
-
- - In an effort to reduce the demoralizing effects that accompany the death of a crew member, Nanotrasen has provided the prototype designs for the Sad Trombone implant. It can be fabricated at your station's protolathe, if you manage to secure the ever elusive Bananium ore.
-
- Joan updated:
-
- - Megafauna will now seek and consume corpses of enemies to heal or otherwise.
- - Toolboxes are slightly more robust.
- - Vanguard now only stuns for 25% of absorbed stuns, from 50%.
-
- Kor updated:
-
- - Hostile mobs will now attack turrets.
-
- Robustin updated:
-
- - Amber ERT Commanders no longer have thermal goggles
-
- lordpidey updated:
-
- - Added Devil agent gamemode, where multiple devils are each trying to buy more souls than the next in line.
- - If you've already sold your soul, you can sell it again to a different devil. You can even go back and forth for INFINITE POWER.
-
-
- 30 July 2016
- astralenigma updated:
-
- - Admins can now turn people into red god.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 2e5523ab41a..40a9d1bce64 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -7280,3 +7280,63 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscdel: Removed Stimulants and Coffee from survival pens.
- tweak: Nanites have been replaced with Mining Nanites which heal more when you
are lower health, and do not have the ridiculous healing Adminorazine had.
+2016-10-01:
+ Incoming5643:
+ - rscadd: After years of having to live on a mostly blown up hunk of junk the wizard's
+ ship has finally been repaired
+ - rscdel: No one paid attention to that lore anyway
+2016-10-07:
+ WJohnston:
+ - imageadd: Improved/resprited AI card, pAI, easel/canvases, shotgun shells, RCD
+ cartridge, speedloaders, and certain older buttons.
+ - imageadd: Improved/resprited a few bar signs, basketball/dodgeball/hoop, blood
+ bags, and body bags.
+ - imageadd: Improved/resprited Paper, stamps, folders, small fires, pens, energy
+ daggers, cabinets, newspaper and other bureaucracy related items.
+2016-10-10:
+ ChemicalRascal:
+ - bugfix: Previously, improving the incinerator's efficiency made the RPM decay
+ more quickly, instead of less quickly. No more!
+ Cyberboss:
+ - rscadd: More reagent containers can be used for filling your dirty vapor cancer
+ sticks
+ - spellcheck: Fixed some vape spelling/grammar
+ MrStonedOne:
+ - tweak: Player Preferences window made slightly faster.
+ Nanotrasen Stress Relief Board:
+ - rscdel: Claymores created through Highlander no longer thirst for blood or announce
+ their wielder's location incessantly.
+ - bugfix: Claymores should now properly absorb fallen foes' corpses.
+ - bugfix: Losing a limb now properly destroys your claymore.
+ Supermichael777:
+ - bugfix: The wizards federation have instituted a strict 1 demon limit on demon
+ bottles.
+ XDTM:
+ - rscadd: Using blood on an Oil Slime will create Corn Oil.
+ - rscadd: Using blood on Pyrite Slimes will create a random crayon.
+ - rscadd: Using water on Orange Slimes will create a small smoke cloud.
+ - rscadd: Using water on Blue Slimes will spawn foam.
+ - rscadd: You can now retrieve materials inserted in a Drone Shell Dispenser with
+ a crowbar.
+ phil235:
+ - rscadd: A whole bunch of structures and machines can now be broken and destroyed
+ using conventional attack methods.
+ - rscadd: The effect of fire on objects is overhauled. When on fire, your external
+ clothes now take fire damage and can become ashes, unless fire proof. All objects
+ caught in a fire can now take fire damage, instead of just flammable ones, unless
+ fire proof.
+ - rscadd: Acid effect is overhauled. Splashing acid on something puts a green effect
+ on it and start slowly melting it. Throwing acid on mobs puts acid on their
+ clothes. Acid can destroy structures and items alike, as long as they're not
+ acid proof. The more acid put on an object, the faster it melts. Walking on
+ an acid puddle puts acid on your shoes or burns your bare feet. Picking up an
+ item with acid without adequate glove protection burns your hand. Acid can be
+ washed away with any sort of water source (extinguisher, shower, water glass,etc...).
+ - rscadd: When a mob receives melee attacks, its clothes also get damaged. Clothes
+ with enough damage get a visual effect. Damaged clothes can be repaired with
+ cloth (produced with botany's biogenerator). Clothes that receives too much
+ melee damage become shreds.
+ - tweak: Clicking a structure/machine with an item on help intent can never result
+ in an attack.
+ - tweak: Hostile animals that are environment destroyers no longer destroys tables&closets
+ in one hit. It now takes several hits depending on the animal.
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 5e71e45d4bf..c29eb7d616f 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index adef4345cc9..84611b698b9 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/item_damage.dmi b/icons/effects/item_damage.dmi
new file mode 100644
index 00000000000..cc23d9fca4a
Binary files /dev/null and b/icons/effects/item_damage.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index f5d72f57c75..fa98af4dc92 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 0d61c44cbbd..be5760d7cf5 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index 967c466a5fd..19b36bfc948 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi
index 6f1aa625ecd..423623ee482 100644
Binary files a/icons/obj/aicards.dmi and b/icons/obj/aicards.dmi differ
diff --git a/icons/obj/airlock_machines.dmi b/icons/obj/airlock_machines.dmi
index 12546b99eae..4bb40dde0ad 100644
Binary files a/icons/obj/airlock_machines.dmi and b/icons/obj/airlock_machines.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index c0b821cdd51..756d94b9496 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi
index a11d1a81d0e..ea24341f5e0 100644
Binary files a/icons/obj/artstuff.dmi and b/icons/obj/artstuff.dmi differ
diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi
index c0d2348ae4e..94256a6b1fb 100644
Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ
diff --git a/icons/obj/basketball.dmi b/icons/obj/basketball.dmi
index 1395fa81eaa..d069a905e44 100644
Binary files a/icons/obj/basketball.dmi and b/icons/obj/basketball.dmi differ
diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi
index afd95f6dba5..bd1995d1633 100644
Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ
diff --git a/icons/obj/bodybag.dmi b/icons/obj/bodybag.dmi
index 0b33b0e3d88..7fcc193ad69 100644
Binary files a/icons/obj/bodybag.dmi and b/icons/obj/bodybag.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 3f0b5eb70c9..dd9987eaf53 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 97f450831fa..626b4a8d6cd 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 06c3a0ce8a4..b18297ab468 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index 3bb8d73b39d..83c1ffedf20 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index c629012bb16..a1a3c03a759 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index 44ad56c7cac..4e6c7b0877a 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/sound/eguitar/Ab4.ogg b/sound/eguitar/Ab4.ogg
index 2bb51a74963..2e0eec164fe 100644
Binary files a/sound/eguitar/Ab4.ogg and b/sound/eguitar/Ab4.ogg differ
diff --git a/sound/eguitar/Ab5.ogg b/sound/eguitar/Ab5.ogg
index d93f0a54ed9..c608bcb956d 100644
Binary files a/sound/eguitar/Ab5.ogg and b/sound/eguitar/Ab5.ogg differ
diff --git a/sound/eguitar/Ab6.ogg b/sound/eguitar/Ab6.ogg
index 514113b97a0..16ad7c12971 100644
Binary files a/sound/eguitar/Ab6.ogg and b/sound/eguitar/Ab6.ogg differ
diff --git a/sound/eguitar/An4.ogg b/sound/eguitar/An4.ogg
index f68a17d35ea..20a0fb86c0f 100644
Binary files a/sound/eguitar/An4.ogg and b/sound/eguitar/An4.ogg differ
diff --git a/sound/eguitar/An5.ogg b/sound/eguitar/An5.ogg
index fa3efd30647..cada6b39338 100644
Binary files a/sound/eguitar/An5.ogg and b/sound/eguitar/An5.ogg differ
diff --git a/sound/eguitar/An6.ogg b/sound/eguitar/An6.ogg
index 034aff99342..2049e1c380f 100644
Binary files a/sound/eguitar/An6.ogg and b/sound/eguitar/An6.ogg differ
diff --git a/sound/eguitar/Bb3.ogg b/sound/eguitar/Bb3.ogg
deleted file mode 100644
index ce0be53df76..00000000000
Binary files a/sound/eguitar/Bb3.ogg and /dev/null differ
diff --git a/sound/eguitar/Bb4.ogg b/sound/eguitar/Bb4.ogg
index 84f008c26fa..fd9ee26319a 100644
Binary files a/sound/eguitar/Bb4.ogg and b/sound/eguitar/Bb4.ogg differ
diff --git a/sound/eguitar/Bb5.ogg b/sound/eguitar/Bb5.ogg
index d6d5b4bba74..25e00e89927 100644
Binary files a/sound/eguitar/Bb5.ogg and b/sound/eguitar/Bb5.ogg differ
diff --git a/sound/eguitar/Bb6.ogg b/sound/eguitar/Bb6.ogg
index af2a80e74e9..d88b147dd93 100644
Binary files a/sound/eguitar/Bb6.ogg and b/sound/eguitar/Bb6.ogg differ
diff --git a/sound/eguitar/Bn4.ogg b/sound/eguitar/Bn4.ogg
index 43d5ca1a18c..9f4546066bc 100644
Binary files a/sound/eguitar/Bn4.ogg and b/sound/eguitar/Bn4.ogg differ
diff --git a/sound/eguitar/Bn5.ogg b/sound/eguitar/Bn5.ogg
index 441313ad135..e70804d4c26 100644
Binary files a/sound/eguitar/Bn5.ogg and b/sound/eguitar/Bn5.ogg differ
diff --git a/sound/eguitar/Bn6.ogg b/sound/eguitar/Bn6.ogg
index 6e6f0012928..27566333bac 100644
Binary files a/sound/eguitar/Bn6.ogg and b/sound/eguitar/Bn6.ogg differ
diff --git a/sound/eguitar/Cn4.ogg b/sound/eguitar/Cn4.ogg
new file mode 100644
index 00000000000..395b341148f
Binary files /dev/null and b/sound/eguitar/Cn4.ogg differ
diff --git a/sound/eguitar/Cn5.ogg b/sound/eguitar/Cn5.ogg
index da0d611bf1d..90b7ee36d39 100644
Binary files a/sound/eguitar/Cn5.ogg and b/sound/eguitar/Cn5.ogg differ
diff --git a/sound/eguitar/Cn6.ogg b/sound/eguitar/Cn6.ogg
index d0719c3ea43..963ca7a6514 100644
Binary files a/sound/eguitar/Cn6.ogg and b/sound/eguitar/Cn6.ogg differ
diff --git a/sound/eguitar/Cn7.ogg b/sound/eguitar/Cn7.ogg
index 3f2133ea5ec..a75cc96a47b 100644
Binary files a/sound/eguitar/Cn7.ogg and b/sound/eguitar/Cn7.ogg differ
diff --git a/sound/eguitar/Db4.ogg b/sound/eguitar/Db4.ogg
index dd074463a71..4a5e2ca3624 100644
Binary files a/sound/eguitar/Db4.ogg and b/sound/eguitar/Db4.ogg differ
diff --git a/sound/eguitar/Db5.ogg b/sound/eguitar/Db5.ogg
index b2318f465e6..0ff3cb2bb9b 100644
Binary files a/sound/eguitar/Db5.ogg and b/sound/eguitar/Db5.ogg differ
diff --git a/sound/eguitar/Db6.ogg b/sound/eguitar/Db6.ogg
index 80cfdd8cc31..19c8323a38d 100644
Binary files a/sound/eguitar/Db6.ogg and b/sound/eguitar/Db6.ogg differ
diff --git a/sound/eguitar/Db7.ogg b/sound/eguitar/Db7.ogg
deleted file mode 100644
index 03ae1a0e060..00000000000
Binary files a/sound/eguitar/Db7.ogg and /dev/null differ
diff --git a/sound/eguitar/Dn4.ogg b/sound/eguitar/Dn4.ogg
index d765d233076..6ba106a7e2d 100644
Binary files a/sound/eguitar/Dn4.ogg and b/sound/eguitar/Dn4.ogg differ
diff --git a/sound/eguitar/Dn5.ogg b/sound/eguitar/Dn5.ogg
index 694ebf3ff17..cfee416673a 100644
Binary files a/sound/eguitar/Dn5.ogg and b/sound/eguitar/Dn5.ogg differ
diff --git a/sound/eguitar/Dn6.ogg b/sound/eguitar/Dn6.ogg
index e1af85f65fc..4b418d1480c 100644
Binary files a/sound/eguitar/Dn6.ogg and b/sound/eguitar/Dn6.ogg differ
diff --git a/sound/eguitar/Dn7.ogg b/sound/eguitar/Dn7.ogg
deleted file mode 100644
index b80fa3f798f..00000000000
Binary files a/sound/eguitar/Dn7.ogg and /dev/null differ
diff --git a/sound/eguitar/Eb4.ogg b/sound/eguitar/Eb4.ogg
index ee4fd001f0f..ba21b35f3a7 100644
Binary files a/sound/eguitar/Eb4.ogg and b/sound/eguitar/Eb4.ogg differ
diff --git a/sound/eguitar/Eb5.ogg b/sound/eguitar/Eb5.ogg
index 57228ad373d..2940c672071 100644
Binary files a/sound/eguitar/Eb5.ogg and b/sound/eguitar/Eb5.ogg differ
diff --git a/sound/eguitar/Eb6.ogg b/sound/eguitar/Eb6.ogg
index b0893576615..ceddb0f6aaa 100644
Binary files a/sound/eguitar/Eb6.ogg and b/sound/eguitar/Eb6.ogg differ
diff --git a/sound/eguitar/Eb7.ogg b/sound/eguitar/Eb7.ogg
deleted file mode 100644
index 182eb5be779..00000000000
Binary files a/sound/eguitar/Eb7.ogg and /dev/null differ
diff --git a/sound/eguitar/En4.ogg b/sound/eguitar/En4.ogg
index fa113951620..7bbd919c188 100644
Binary files a/sound/eguitar/En4.ogg and b/sound/eguitar/En4.ogg differ
diff --git a/sound/eguitar/En5.ogg b/sound/eguitar/En5.ogg
index 6ffa8fa068c..5692f1f9bb9 100644
Binary files a/sound/eguitar/En5.ogg and b/sound/eguitar/En5.ogg differ
diff --git a/sound/eguitar/En6.ogg b/sound/eguitar/En6.ogg
index af0010480b0..7190f49ff63 100644
Binary files a/sound/eguitar/En6.ogg and b/sound/eguitar/En6.ogg differ
diff --git a/sound/eguitar/En7.ogg b/sound/eguitar/En7.ogg
deleted file mode 100644
index 92a3043b118..00000000000
Binary files a/sound/eguitar/En7.ogg and /dev/null differ
diff --git a/sound/eguitar/Fn4.ogg b/sound/eguitar/Fn4.ogg
index 6510ddebcb3..c67095b28af 100644
Binary files a/sound/eguitar/Fn4.ogg and b/sound/eguitar/Fn4.ogg differ
diff --git a/sound/eguitar/Fn5.ogg b/sound/eguitar/Fn5.ogg
index 4fac6914d59..02fc7f1991c 100644
Binary files a/sound/eguitar/Fn5.ogg and b/sound/eguitar/Fn5.ogg differ
diff --git a/sound/eguitar/Fn6.ogg b/sound/eguitar/Fn6.ogg
index 4663cfb53da..2a4f7769215 100644
Binary files a/sound/eguitar/Fn6.ogg and b/sound/eguitar/Fn6.ogg differ
diff --git a/sound/eguitar/Fn7.ogg b/sound/eguitar/Fn7.ogg
deleted file mode 100644
index 6f7b365e498..00000000000
Binary files a/sound/eguitar/Fn7.ogg and /dev/null differ
diff --git a/sound/eguitar/Gb4.ogg b/sound/eguitar/Gb4.ogg
index 94d8b2fb920..68623203a04 100644
Binary files a/sound/eguitar/Gb4.ogg and b/sound/eguitar/Gb4.ogg differ
diff --git a/sound/eguitar/Gb5.ogg b/sound/eguitar/Gb5.ogg
index 8177e1bbc4a..f8a0f79c322 100644
Binary files a/sound/eguitar/Gb5.ogg and b/sound/eguitar/Gb5.ogg differ
diff --git a/sound/eguitar/Gb6.ogg b/sound/eguitar/Gb6.ogg
index 0ca896f81bd..7ab658e12d9 100644
Binary files a/sound/eguitar/Gb6.ogg and b/sound/eguitar/Gb6.ogg differ
diff --git a/sound/eguitar/Gb7.ogg b/sound/eguitar/Gb7.ogg
deleted file mode 100644
index 1e37c7afa34..00000000000
Binary files a/sound/eguitar/Gb7.ogg and /dev/null differ
diff --git a/sound/eguitar/Gn4.ogg b/sound/eguitar/Gn4.ogg
index f2202957c5d..0a2bc3770a7 100644
Binary files a/sound/eguitar/Gn4.ogg and b/sound/eguitar/Gn4.ogg differ
diff --git a/sound/eguitar/Gn5.ogg b/sound/eguitar/Gn5.ogg
index 76574a6ac4a..38e04cef3b4 100644
Binary files a/sound/eguitar/Gn5.ogg and b/sound/eguitar/Gn5.ogg differ
diff --git a/sound/eguitar/Gn6.ogg b/sound/eguitar/Gn6.ogg
index e3c3ee14355..df8cf865172 100644
Binary files a/sound/eguitar/Gn6.ogg and b/sound/eguitar/Gn6.ogg differ
diff --git a/sound/eguitar/Gn7.ogg b/sound/eguitar/Gn7.ogg
deleted file mode 100644
index 9e67a7588dd..00000000000
Binary files a/sound/eguitar/Gn7.ogg and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index 3498b295a39..02781f35c61 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -16,7 +16,6 @@
#include "_maps\__MAP_DEFINES.dm"
#include "_maps\tgstation2.dm"
#include "code\_compile_options.dm"
-#include "code\hub.dm"
#include "code\world.dm"
#include "code\__DATASTRUCTURES\heap.dm"
#include "code\__DATASTRUCTURES\linked_lists.dm"
@@ -136,11 +135,13 @@
#include "code\controllers\failsafe.dm"
#include "code\controllers\master.dm"
#include "code\controllers\subsystem.dm"
+#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\air.dm"
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\augury.dm"
#include "code\controllers\subsystem\diseases.dm"
#include "code\controllers\subsystem\events.dm"
+#include "code\controllers\subsystem\fire_burning.dm"
#include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\ipintel.dm"
@@ -549,6 +550,7 @@
#include "code\game\objects\empulse.dm"
#include "code\game\objects\explosion.dm"
#include "code\game\objects\items.dm"
+#include "code\game\objects\obj_defense.dm"
#include "code\game\objects\objs.dm"
#include "code\game\objects\radiation.dm"
#include "code\game\objects\structures.dm"
@@ -764,6 +766,7 @@
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guncase.dm"
#include "code\game\objects\structures\hivebot.dm"
+#include "code\game\objects\structures\holosign.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\ladders.dm"
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index ec8b0ce7eed..15dd54c62fa 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,16 +1,16 @@
-require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,P=k[b](m?{}:-0,1)!=k,E=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(E||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],_=m?r:r[e]||(r[e]={}),x=_[u]||(_[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){p(n,e,b);var w,k,P=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},E=e+" Iterator",C=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,E,!0),!a&&s(A,h)&&o(M,f,g),C&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),u[e]=T,u[E]=g,y)if(w={values:C?T:P(v),keys:_?T:P(m),entries:C?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){n=!0},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",u="
",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),_=t(76),x=t(79),w=t(34),k=t(82)("__proto__"),P=t(8),E=t(7)(!1),C=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=p("iframe"),n=D,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("i;)c(r,a=t[i++])&&(~E(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,D,!1)});var q=function(t,e,n){if(!(e in j)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";j[e]=Function("F,a","return new F("+a.join(",")+")")}return j[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=x(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=_(t,n),i=_(e,n),o=x(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var G=function(t){return function(e,n){m(e);var a=w(this),r=x(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||U(P(0)),map:U(P(1)),filter:U(P(2)),some:U(P(3)),every:U(P(4)),reduce:G(!1),reduceRight:G(!0),indexOf:U(E),lastIndexOf:function(t,e){var n=b(this),a=x(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=x(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var a=t(3),r=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),_="Promise",x=o.process,w="process"==u(x),k=o[_],P=function(t){var e=new k(function(){});return t&&(e.constructor=Object),k.resolve(e)===e},E=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&P(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),C=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},S=function(t){var e=l(t)[g];return void 0!=e?e:t},A=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},O=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},T=function(t){try{t()}catch(e){return{error:e}}},M=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=A(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;R(r)&&(w?x.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},R=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!R(e.promise))return!1;return!0},j=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),M(e,!0))},L=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=A(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(L,a,1),s(j,a,1))}catch(r){j.call(a,r)}}):(n.v=t,n.s=1,M(n,!1))}catch(a){j.call({r:n,d:!1},a)}}};E||(k=function(t){f(t);var e=this._d={p:d(this,k,_),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(L,e,1),s(j,e,1))}catch(n){j.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new O(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&M(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!E,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],p(p.S+p.F*!E,_,{reject:function(t){var e=new O(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!E||P(!0)),_,{resolve:function(t){if(t instanceof k&&C(t.constructor,this))return t;var e=new O(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(E&&t(43)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=S(this),n=new O(e),a=n.resolve,i=n.reject,o=[],s=T(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=S(this),n=new O(e),a=n.reject,r=T(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var a=t(22),r=Function.apply;a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,n)}})},{22:22}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t);var n=arguments.length<3?t:i(arguments[2]);if(t==n){if(void 0!=e)switch(o(e).length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var a=t(46);t(19)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),_=t(59),x=a.getDesc,w=a.setDesc,k=a.create,P=m.get,E=r.Symbol,C=r.JSON,S=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),j="function"==typeof E,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=x(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,D=function(t){var e=R[t]=k(E.prototype);return e._k=t,o&&A&&N(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),N(this,t,_(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:_(0,!1)})):(i(t,O)||w(t,O,_(1,{})),t[O][e]=!0),N(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},G=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,O)&&this[O][t]?e:!0},U=function(t,e){var n=x(t=y(t),e);return!n||!i(R,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,S.apply(C,a)}},H=p(function(){var t=E();return"[null]"!=S([t])||"{}"!=S({a:t})||"{}"!=S(Object(t))});j||(E=function(){if(F(this))throw TypeError("Symbol is not a constructor");return D(f(arguments.length>0?arguments[0]:void 0))},u(E.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof E},a.create=q,a.isEnum=G,a.getDesc=U,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",G,!0));var Q={"for":function(t){return i(M,t+="")?M[t]:M[t]=E(t)},keyFor:function(t){return h(M,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);Q[t]=j?e:D(e)}),A=!0,s(s.G+s.W,{Symbol:E}),s(s.S,"Symbol",Q),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(E,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===P)throw Error("Generator is already running");if(a===E){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=E,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=P;var p=r(t,e,n);if("normal"===p.type){a=n.done?E:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=E,i="throw",o=p.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==_&&g==_&&b==_||v==x&&g==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,_=t.Element.prototype,x=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,P={},E=document.createElement("div"),C=document.documentElement,S=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,_,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(x,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(_,{textContent:{get:o,set:p},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(P,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&E.appendChild(u),(o=u.getAttribute(p))&&S.call(u,p)),u.fireEvent(p,r),P[p]=!0}catch(r){for(P[p]=!1;E.hasChildNodes();)E.removeChild(E.firstChild)}null!=o&&A.call(u,p,o)}else P[p]=!1;(f.n=P[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(x,{addEventListener:{value:_.addEventListener},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:_.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;_.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,_=(0,o["default"])([m,v],[0,i]),x=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=x,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function P(t){return null==t?t:(Qo.hasOwnProperty(t)||(Qo[t]=new Ko(t)),Qo[t])}function E(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=P(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function S(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},E(t,P(S(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Jo);return t.set(e,+a+n)}function O(t,e){return Xo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function M(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function j(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function D(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0);
-}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function G(t,e,n){var a;return e=S(e),"~/"===e.substr(0,2)?(a=P(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=U(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,P(e),n),a}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return P(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),P(n.join("."))}return P(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=P(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=P(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function Q(t){t.unbind()}function K(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function X(t){t.detachNodes()}function J(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=P(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=P(S(t)),e=this.viewmodel.get(t,Qs),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=P(S(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=E(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Pt(t,e,n,a){var r,i,o;e=P(S(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Et(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function St(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&jt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Du,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Dt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Dt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Gt(r,i)}:Gt(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Gt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Po(Ku);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Ji){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a i;)c(r,a=t[i++])&&(~E(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,D,!1)});var q=function(t,e,n){if(!(e in j)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";j[e]=Function("F,a","return new F("+a.join(",")+")")}return j[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=x(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=_(t,n),i=_(e,n),o=x(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var G=function(t){return function(e,n){m(e);var a=w(this),r=x(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||U(P(0)),map:U(P(1)),filter:U(P(2)),some:U(P(3)),every:U(P(4)),reduce:G(!1),reduceRight:G(!0),indexOf:U(E),lastIndexOf:function(t,e){var n=b(this),a=x(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=x(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var a=t(3),r=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),_="Promise",x=o.process,w="process"==u(x),k=o[_],P=function(){},E=function(t){var e,n=new k(P);return t&&(n.constructor=function(t){t(P,P)}),(e=k.resolve(n))["catch"](P),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&E(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),S=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},M=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;j(r)&&(w?x.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},j=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!j(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),R(e,!0))},N=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(N,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(k=function(t){f(t);var e=this._d={p:d(this,k,_),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(N,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],p(p.S+p.F*!C,_,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||E(!0)),_,{resolve:function(t){if(t instanceof k&&S(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=M(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=M(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var a=t(46);t(19)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),_=t(59),x=a.getDesc,w=a.setDesc,k=a.create,P=m.get,E=r.Symbol,C=r.JSON,S=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),j="function"==typeof E,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=x(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,D=function(t){var e=R[t]=k(E.prototype);return e._k=t,o&&A&&N(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),N(this,t,_(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:_(0,!1)})):(i(t,O)||w(t,O,_(1,{})),t[O][e]=!0),N(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},G=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,O)&&this[O][t]?e:!0},U=function(t,e){var n=x(t=y(t),e);return!n||!i(R,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=P(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,S.apply(C,a)}},H=p(function(){var t=E();return"[null]"!=S([t])||"{}"!=S({a:t})||"{}"!=S(Object(t))});j||(E=function(){if(F(this))throw TypeError("Symbol is not a constructor");return D(f(arguments.length>0?arguments[0]:void 0))},u(E.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof E},a.create=q,a.isEnum=G,a.getDesc=U,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",G,!0));var Q={"for":function(t){return i(M,t+="")?M[t]:M[t]=E(t)},keyFor:function(t){return h(M,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);Q[t]=j?e:D(e)}),A=!0,s(s.G+s.W,{Symbol:E}),s(s.S,"Symbol",Q),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(E,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===P)throw Error("Generator is already running");if(a===E){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=E,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=P;var p=r(t,e,n);if("normal"===p.type){a=n.done?E:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=E,i="throw",o=p.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==_&&g==_&&b==_||v==x&&g==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,_=t.Element.prototype,x=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,P={},E=document.createElement("div"),C=document.documentElement,S=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,_,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(x,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(_,{textContent:{get:o,set:p},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(P,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&E.appendChild(u),(o=u.getAttribute(p))&&S.call(u,p)),u.fireEvent(p,r),P[p]=!0}catch(r){for(P[p]=!1;E.hasChildNodes();)E.removeChild(E.firstChild)}null!=o&&A.call(u,p,o)}else P[p]=!1;(f.n=P[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(x,{addEventListener:{value:_.addEventListener},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:_.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;_.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,_=(0,o["default"])([m,v],[0,i]),x=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=x,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function P(t){return null==t?t:(Qo.hasOwnProperty(t)||(Qo[t]=new Ko(t)),Qo[t])}function E(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=P(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function S(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},E(t,P(S(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Jo);return t.set(e,+a+n)}function O(t,e){return Xo(this,t,void 0===e?1:+e)}
+function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function M(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function j(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function D(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function G(t,e,n){var a;return e=S(e),"~/"===e.substr(0,2)?(a=P(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=U(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,P(e),n),a}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return P(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),P(n.join("."))}return P(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=P(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=P(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function Q(t){t.unbind()}function K(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function X(t){t.detachNodes()}function J(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=P(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=P(S(t)),e=this.viewmodel.get(t,Qs),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=P(S(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=E(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Pt(t,e,n,a){var r,i,o;e=P(S(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Et(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function St(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&jt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Du,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Dt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Dt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Gt(r,i)}:Gt(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Gt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Po(Ku);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Ji){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a |