Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit58
This commit is contained in:
@@ -29,69 +29,62 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
/client/proc/callproc()
|
||||
set category = "Debug"
|
||||
set name = "Advanced ProcCall"
|
||||
set waitfor = 0
|
||||
set waitfor = FALSE
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
var/datum/target = null
|
||||
var/targetselected = 0
|
||||
var/targetselected = FALSE
|
||||
var/returnval = null
|
||||
|
||||
switch(alert("Proc owned by something?",,"Yes","No"))
|
||||
if("Yes")
|
||||
targetselected = 1
|
||||
var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT))
|
||||
if (!value["class"] || !value["value"])
|
||||
return
|
||||
target = value["value"]
|
||||
if("No")
|
||||
target = null
|
||||
targetselected = 0
|
||||
|
||||
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
|
||||
if(!procname)
|
||||
return
|
||||
|
||||
//hascall() doesn't support proc paths (eg: /proc/gib(), it only supports "gib")
|
||||
var/testname = procname
|
||||
if(targetselected)
|
||||
//Find one of the 3 possible ways they could have written /proc/PROCNAME
|
||||
if(findtext(procname, "/proc/"))
|
||||
testname = replacetext(procname, "/proc/", "")
|
||||
else if(findtext(procname, "/proc"))
|
||||
testname = replacetext(procname, "/proc", "")
|
||||
else if(findtext(procname, "proc/"))
|
||||
testname = replacetext(procname, "proc/", "")
|
||||
//Clear out any parenthesis if they're a dummy
|
||||
testname = replacetext(testname, "()", "")
|
||||
|
||||
if(targetselected && !hascall(target,testname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no proc named [procname].</font>")
|
||||
return
|
||||
else
|
||||
var/procpath = text2path(procname)
|
||||
if (!procpath)
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)</font>")
|
||||
if(alert("Proc owned by something?",,"Yes","No") == "Yes")
|
||||
targetselected = TRUE
|
||||
var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT))
|
||||
if (!value["class"] || !value["value"])
|
||||
return
|
||||
target = value["value"]
|
||||
|
||||
var/procpath = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
|
||||
if(!procpath)
|
||||
return
|
||||
|
||||
//strip away everything but the proc name
|
||||
var/list/proclist = splittext(procpath, "/")
|
||||
if (!length(proclist))
|
||||
return
|
||||
|
||||
var/procname = proclist[proclist.len]
|
||||
var/proctype = ("verb" in proclist) ? "verb" :"proc"
|
||||
|
||||
if(targetselected)
|
||||
if(!hascall(target, procname))
|
||||
to_chat(usr, "<span class='warning'>Error: callproc(): type [target.type] has no [proctype] named [procpath].</span>")
|
||||
return
|
||||
else
|
||||
procpath = "/[proctype]/[procname]"
|
||||
if(!text2path(procpath))
|
||||
to_chat(usr, "<span class='warning'>Error: callproc(): [procpath] does not exist.</span>")
|
||||
return
|
||||
|
||||
var/list/lst = get_callproc_args()
|
||||
if(!lst)
|
||||
return
|
||||
|
||||
if(targetselected)
|
||||
if(!target)
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>")
|
||||
to_chat(usr, "<span class='warning'>Error: callproc(): owner of proc no longer exists.</span>")
|
||||
return
|
||||
var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]."
|
||||
var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]."
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
admin_ticket_log(target, msg)
|
||||
returnval = WrapAdminProcCall(target, procname, lst) // Pass the lst as an argument list to the proc
|
||||
returnval = WrapAdminProcCall(target, procname, lst)
|
||||
else
|
||||
//this currently has no hascall protection. wasn't able to get it working.
|
||||
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc
|
||||
var/msg = "[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]."
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
returnval = WrapAdminProcCall(GLOBAL_PROC, procpath, lst) //calling globals needs full qualified name (e.g /proc/foo)
|
||||
. = get_callproc_returnval(returnval, procname)
|
||||
if(.)
|
||||
to_chat(usr, .)
|
||||
@@ -111,8 +104,8 @@ GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention)
|
||||
GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
|
||||
/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
|
||||
if(target && procname == "Del")
|
||||
to_chat(usr, "Calling Del() is not allowed")
|
||||
if(target != GLOBAL_PROC && procname == "Del")
|
||||
to_chat(usr, "<span class='warning'>Calling Del() is not allowed</span>")
|
||||
return
|
||||
|
||||
if(target != GLOBAL_PROC && !target.CanProcCall(procname))
|
||||
@@ -159,7 +152,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
/client/proc/callproc_datum(datum/A as null|area|mob|obj|turf)
|
||||
set category = "Debug"
|
||||
set name = "Atom ProcCall"
|
||||
set waitfor = 0
|
||||
set waitfor = FALSE
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
@@ -168,7 +161,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
if(!procname)
|
||||
return
|
||||
if(!hascall(A,procname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc_datum(): type [A.type] has no proc named [procname].</font>")
|
||||
to_chat(usr, "<span class='warning'>Error: callproc_datum(): type [A.type] has no proc named [procname].</span>")
|
||||
return
|
||||
var/list/lst = get_callproc_args()
|
||||
if(!lst)
|
||||
@@ -177,8 +170,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
if(!A || !IsValidSrc(A))
|
||||
to_chat(usr, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
|
||||
return
|
||||
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]."
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
admin_ticket_log(A, msg)
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -188,8 +181,6 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
if(.)
|
||||
to_chat(usr, .)
|
||||
|
||||
|
||||
|
||||
/client/proc/get_callproc_args()
|
||||
var/argnum = input("Number of arguments","Number:",0) as num|null
|
||||
if(isnull(argnum))
|
||||
@@ -213,7 +204,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
. = ""
|
||||
if(islist(returnval))
|
||||
var/list/returnedlist = returnval
|
||||
. = "<font color='blue'>"
|
||||
. = "<span class='notice'>"
|
||||
if(returnedlist.len)
|
||||
var/assoc_check = returnedlist[1]
|
||||
if(istext(assoc_check) && (returnedlist[assoc_check] != null))
|
||||
@@ -227,11 +218,10 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
. += "\n[elem]"
|
||||
else
|
||||
. = "[procname] returned an empty list"
|
||||
. += "</font>"
|
||||
. += "</span>"
|
||||
|
||||
else
|
||||
. = "<font color='blue'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</font>"
|
||||
|
||||
. = "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>"
|
||||
|
||||
/client/proc/Cell()
|
||||
set category = "Debug"
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
cross.icon_state = "kingyellow"
|
||||
font_color = "blue"
|
||||
prayer_type = "CHAPLAIN PRAYER"
|
||||
if(SSreligion.deity)
|
||||
deity = SSreligion.deity
|
||||
if(GLOB.deity)
|
||||
deity = GLOB.deity
|
||||
else if(iscultist(usr))
|
||||
cross.icon_state = "tome"
|
||||
font_color = "red"
|
||||
|
||||
@@ -126,8 +126,20 @@
|
||||
if(vest)
|
||||
vest.flip_mode()
|
||||
|
||||
/obj/machinery/abductor/console/proc/SelectDisguise(remote = 0)
|
||||
var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises
|
||||
/obj/machinery/abductor/console/proc/SelectDisguise(remote = FALSE)
|
||||
var/list/disguises2 = list()
|
||||
for(var/name in disguises)
|
||||
var/datum/icon_snapshot/snap = disguises[name]
|
||||
var/image/dummy = image(snap.icon, src, snap.icon_state)
|
||||
dummy.overlays = snap.overlays
|
||||
disguises2[name] = dummy
|
||||
|
||||
var/entry_name
|
||||
if(remote)
|
||||
entry_name = show_radial_menu(usr, camera.eyeobj, disguises2)
|
||||
else
|
||||
entry_name = show_radial_menu(usr, src, disguises2)
|
||||
|
||||
var/datum/icon_snapshot/chosen = disguises[entry_name]
|
||||
if(chosen && vest && (remote || in_range(usr,src)))
|
||||
vest.SetDisguise(chosen)
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/effect/proc_holder/changeling/adrenaline
|
||||
name = "Adrenaline Sacs"
|
||||
desc = "We evolve additional sacs of adrenaline throughout our body."
|
||||
helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body."
|
||||
helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body. This ability is loud, and might cause our blood to react violently to heat."
|
||||
chemical_cost = 30
|
||||
loudness = 2
|
||||
dna_cost = 2
|
||||
req_human = 1
|
||||
req_stat = UNCONSCIOUS
|
||||
@@ -12,5 +13,5 @@
|
||||
|
||||
//Recover from stuns.
|
||||
/obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user)
|
||||
user.do_adrenaline(100, FALSE, 70, 0, TRUE, list("epinephrine" = 3, "changelingmeth" = 10, "mannitol" = 10, "omnizine" = 10, "changelingadrenaline" = 5), "<span class='notice'>Energy rushes through us.</span>")
|
||||
return TRUE
|
||||
user.do_adrenaline(0, FALSE, 70, 0, TRUE, list("epinephrine" = 3, "changelingmeth" = 10, "mannitol" = 10, "regen_jelly" = 10, "changelingadrenaline" = 5), "<span class='notice'>Energy rushes through us.</span>", 0, 0.75, 0)
|
||||
return TRUE
|
||||
@@ -29,7 +29,7 @@
|
||||
O.forceMove(get_turf(user))
|
||||
|
||||
user.reagents.add_reagent("mutadone", 10)
|
||||
user.reagents.add_reagent("pen_acid", 20)
|
||||
user.reagents.add_reagent("pen_jelly", 20)
|
||||
user.reagents.add_reagent("antihol", 10)
|
||||
user.reagents.add_reagent("mannitol", 25)
|
||||
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
/obj/structure/destructible/clockwork/reflector
|
||||
name = "reflector"
|
||||
desc = "A large lantern-shaped machine made of thin brass. It looks fragile."
|
||||
clockwork_desc = "A lantern-shaped generator that produces power when near starlight."
|
||||
icon_state = "reflector"
|
||||
unanchored_icon = "reflector_unwrenched"
|
||||
max_integrity = 40
|
||||
construction_value = 5
|
||||
layer = WALL_OBJ_LAYER
|
||||
break_message = "<span class='warning'>The reflectors's fragile shield shatters into pieces!</span>"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
light_color = "#DAAA18"
|
||||
var/list/allowed_projectile_typecache = list(
|
||||
/obj/item/projectile/beam
|
||||
)
|
||||
|
||||
var/ini_dir = null
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/Initialize()
|
||||
. = ..()
|
||||
allowed_projectile_typecache = typecacheof(allowed_projectile_typecache)
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation))
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/bullet_act(obj/item/projectile/P)
|
||||
if(!anchored || !allowed_projectile_typecache[P.type] || !(P.dir in GLOB.cardinals))
|
||||
return ..()
|
||||
|
||||
if(auto_reflect(P, P.dir, get_turf(P), P.Angle) != -1)
|
||||
return ..()
|
||||
|
||||
return -1
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/proc/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle)
|
||||
|
||||
//Yell at me if this exists already.
|
||||
|
||||
var/real_angle = 0
|
||||
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
real_angle = 0
|
||||
if(EAST)
|
||||
real_angle = 90
|
||||
if(SOUTH)
|
||||
real_angle = 180
|
||||
if(WEST)
|
||||
real_angle = 270
|
||||
|
||||
var/incidence = GET_ANGLE_OF_INCIDENCE(real_angle, (P.Angle + 180))
|
||||
if(abs(incidence) > 90 && abs(incidence) < 270)
|
||||
return FALSE
|
||||
var/new_angle = SIMPLIFY_DEGREES(real_angle + incidence)
|
||||
P.setAngle(new_angle)
|
||||
P.ignore_source_check = TRUE
|
||||
P.range = P.decayedRange
|
||||
P.decayedRange = max(P.decayedRange--, 0)
|
||||
return -1
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/proc/can_be_rotated(mob/user,rotation_type)
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>[src] cannot be rotated while it is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/Move()
|
||||
. = ..()
|
||||
setDir(ini_dir)
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/proc/after_rotation(mob/user,rotation_type)
|
||||
ini_dir = dir
|
||||
add_fingerprint(user)
|
||||
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/wrench_act(mob/living/user, obj/item/I)
|
||||
|
||||
if(!is_servant_of_ratvar(user))
|
||||
return ..()
|
||||
|
||||
anchored = !anchored
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] \the [src].</span>")
|
||||
I.play_tool_sound(src)
|
||||
return TRUE
|
||||
@@ -361,6 +361,7 @@
|
||||
reshape.Shift(EAST, 1)
|
||||
reshape.Crop(7,4,26,31)
|
||||
reshape.Crop(-5,-3,26,30)
|
||||
return reshape
|
||||
|
||||
/mob/living/carbon/human/get_sac_image()
|
||||
var/datum/job/sacjob = SSjob.GetJob(mind.assigned_role)
|
||||
@@ -370,6 +371,7 @@
|
||||
reshape.Shift(EAST, 1)
|
||||
reshape.Crop(7,4,26,31)
|
||||
reshape.Crop(-5,-3,26,30)
|
||||
return reshape
|
||||
|
||||
/datum/objective/sacrifice
|
||||
var/sacced = FALSE
|
||||
|
||||
@@ -342,10 +342,7 @@
|
||||
if(cooldown>world.time)
|
||||
to_chat(owner, "<span class='cultbold'>You aren't ready to place another blood mark yet!</span>")
|
||||
return
|
||||
if(owner.orbiting && owner.orbiting.orbiting)
|
||||
target = owner.orbiting.orbiting
|
||||
else
|
||||
target = get_turf(owner)
|
||||
target = owner.orbiting?.parent || get_turf(owner)
|
||||
if(!target)
|
||||
return
|
||||
C.cult_team.blood_target = target
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
visible_message("<span class='warning'>[src] easily breaks out of [p_their()] handcuffs!</span>", \
|
||||
"<span class='notice'>With just a thought your handcuffs fall off.</span>")
|
||||
|
||||
/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
cached_gases[/datum/gas/oxygen] -= cached_gases[/datum/gas/tritium]
|
||||
|
||||
if(burned_fuel)
|
||||
energy_released += FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel
|
||||
energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel)
|
||||
if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
|
||||
radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
|
||||
|
||||
@@ -285,6 +285,7 @@
|
||||
if(do_explosion)
|
||||
explosion(location, 0, 0, 5, power_ratio, TRUE, TRUE) //large shockwave, the actual radius is quite small - people will recognize that you're doing fusion
|
||||
radiation_pulse(location, radiation_power) //You mean causing a super-tier fusion reaction in the halls is a bad idea?
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, 30000)//The science is cool though.
|
||||
playsound(location, 'sound/effects/supermatter.ogg', 100, 0)
|
||||
else
|
||||
playsound(location, 'sound/effects/phasein.ogg', 75, 0)
|
||||
@@ -350,12 +351,20 @@
|
||||
var/old_heat_capacity = air.heat_capacity()
|
||||
var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
|
||||
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
|
||||
if(cached_gases[/datum/gas/miasma] && cached_gases[/datum/gas/miasma] > 0)
|
||||
energy_released /= cached_gases[/datum/gas/miasma]*0.1
|
||||
if(cached_gases[/datum/gas/bz] && cached_gases[/datum/gas/bz] > 0)
|
||||
energy_released *= cached_gases[/datum/gas/bz]*0.1
|
||||
if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing.
|
||||
return NO_REACTION
|
||||
cached_gases[/datum/gas/bz] += reaction_efficency
|
||||
if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
|
||||
cached_gases[/datum/gas/bz] -= min(pressure,1)
|
||||
cached_gases[/datum/gas/oxygen] += min(pressure,1)
|
||||
cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
|
||||
cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
|
||||
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (reaction_efficency**0.5)*BZ_RESEARCH_AMOUNT)
|
||||
|
||||
if(energy_released > 0)
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
@@ -390,6 +399,7 @@
|
||||
cached_gases[/datum/gas/plasma] -= heat_scale
|
||||
cached_gases[/datum/gas/nitryl] -= heat_scale
|
||||
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0))
|
||||
if(stim_energy_change)
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
|
||||
@@ -418,6 +428,7 @@
|
||||
cached_gases[/datum/gas/nitrogen] -= 20*nob_formed
|
||||
cached_gases[/datum/gas/hypernoblium]+= nob_formed
|
||||
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, nob_formed*NOBLIUM_RESEARCH_AMOUNT)
|
||||
|
||||
if (nob_formed)
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
@@ -449,3 +460,4 @@
|
||||
|
||||
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
|
||||
air.temperature += cleaned_air * 0.002
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
|
||||
@@ -27,7 +27,12 @@ Thus, the two variables affect pump operation are set in New():
|
||||
|
||||
construction_type = /obj/item/pipe/directional
|
||||
pipe_state = "pump"
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/pump/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Ctrl</b> and click on it to toggle it on and off.</span>")
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its pressure.</span>")
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -37,7 +42,7 @@ Thus, the two variables affect pump operation are set in New():
|
||||
investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/pump/AltClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -46,7 +51,7 @@ Thus, the two variables affect pump operation are set in New():
|
||||
to_chat(user,"<span class='notice'>You maximize the pressure on the [src].</span>")
|
||||
investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/pump/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
|
||||
@@ -28,16 +28,21 @@ Thus, the two variables affect pump operation are set in New():
|
||||
construction_type = /obj/item/pipe/directional
|
||||
pipe_state = "volumepump"
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/volume_pump/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Ctrl</b> and click on it to toggle it on and off.</span>")
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its pressure.</span>")
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
|
||||
on = !on
|
||||
update_icon()
|
||||
investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
investigate_log("Volume Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Volume Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/volume_pump/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
|
||||
@@ -12,24 +12,29 @@
|
||||
construction_type = /obj/item/pipe/trinary/flippable
|
||||
pipe_state = "filter"
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Ctrl</b> and click on it to toggle it on and off.</span>")
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its pressure.</span>")
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
|
||||
on = !on
|
||||
update_icon()
|
||||
investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
investigate_log("Filter, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Filter, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/AltClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
|
||||
target_pressure = MAX_OUTPUT_PRESSURE
|
||||
to_chat(user,"<span class='notice'>You maximize the pressure on the [src].</span>")
|
||||
investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
investigate_log("Filter, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Filter, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
|
||||
@@ -14,25 +14,31 @@
|
||||
pipe_state = "mixer"
|
||||
|
||||
//node 3 is the outlet, nodes 1 & 2 are intakes
|
||||
/obj/machinery/atmospherics/components/trinary/mixer/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Ctrl</b> and click on it to toggle it on and off.</span>")
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its pressure.</span>")
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
|
||||
on = !on
|
||||
update_icon()
|
||||
investigate_log("Pump, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
investigate_log("Mixer, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Mixer, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/mixer/AltClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
|
||||
target_pressure = MAX_OUTPUT_PRESSURE
|
||||
to_chat(user,"<span class='notice'>You maximize the pressure on the [src].</span>")
|
||||
investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
investigate_log("Mixer, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Mixer, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
//node 3 is the outlet, nodes 1 & 2 are intakes
|
||||
/obj/machinery/atmospherics/components/trinary/mixer/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
|
||||
@@ -68,13 +68,18 @@
|
||||
GLOB.poi_list |= src
|
||||
LAZYADD(GLOB.mob_spawners[job_description ? job_description : name], src)
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/Destroy()
|
||||
GLOB.poi_list -= src
|
||||
LAZYREMOVE(GLOB.mob_spawners[job_description ? job_description : name], src)
|
||||
if(!LAZYLEN(GLOB.mob_spawners[job_description ? job_description : name]))
|
||||
GLOB.mob_spawners -= job_description ? job_description : name
|
||||
var/job_name = job_description ? job_description : name
|
||||
GLOB.mob_spawners -= job_name
|
||||
if(!LAZYLEN(GLOB.mob_spawners[job_name]))
|
||||
LAZYREMOVE(GLOB.mob_spawners[job_name], src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/proc/can_latejoin() //If it can be taken from the lobby.
|
||||
return ghost_usable
|
||||
|
||||
/obj/effect/mob_spawn/proc/special(mob/M)
|
||||
return
|
||||
|
||||
|
||||
@@ -131,6 +131,24 @@
|
||||
unit_name = "security barrier"
|
||||
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
|
||||
|
||||
/datum/export/large/gas_canister
|
||||
cost = 10 //Base cost of canister. You get more for nice gases inside.
|
||||
unit_name = "Gas Canister"
|
||||
export_types = list(/obj/machinery/portable_atmospherics/canister)
|
||||
/datum/export/large/gas_canister/get_cost(obj/O)
|
||||
var/obj/machinery/portable_atmospherics/canister/C = O
|
||||
var/worth = 10
|
||||
var/gases = C.air_contents.gases
|
||||
|
||||
worth += gases[/datum/gas/bz]*4
|
||||
worth += gases[/datum/gas/stimulum]*25
|
||||
worth += gases[/datum/gas/hypernoblium]*1000
|
||||
worth += gases[/datum/gas/miasma]*15
|
||||
worth += gases[/datum/gas/tritium]*7
|
||||
worth += gases[/datum/gas/pluoxium]*6
|
||||
worth += gases[/datum/gas/nitryl]*30
|
||||
return worth
|
||||
|
||||
/datum/export/large/odysseus
|
||||
cost = 5500
|
||||
unit_name = "working odysseus"
|
||||
|
||||
@@ -516,14 +516,16 @@
|
||||
|
||||
/datum/supply_pack/security/armory/ballistic
|
||||
name = "Combat Shotguns Crate"
|
||||
desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, and three Shotgun Bandoliers. Requires Armory access to open."
|
||||
desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, with three Shotgun Bandoliers, as well as seven buchshot and 12g shotgun slugs. Requires Armory access to open."
|
||||
cost = 8000
|
||||
contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat,
|
||||
/obj/item/gun/ballistic/shotgun/automatic/combat,
|
||||
/obj/item/gun/ballistic/shotgun/automatic/combat,
|
||||
/obj/item/storage/belt/bandolier,
|
||||
/obj/item/storage/belt/bandolier,
|
||||
/obj/item/storage/belt/bandolier)
|
||||
/obj/item/storage/belt/bandolier,
|
||||
/obj/item/storage/box/lethalshot,
|
||||
/obj/item/storage/box/lethalslugs)
|
||||
crate_name = "combat shotguns crate"
|
||||
|
||||
/datum/supply_pack/security/armory/dragnetgun
|
||||
@@ -567,7 +569,7 @@
|
||||
|
||||
/datum/supply_pack/security/armory/fire
|
||||
name = "Incendiary Weapons Crate"
|
||||
desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Brige access to open."
|
||||
desc = "Burn, baby burn. Contains three incendiary grenades, seven incendiary slugs, three plasma canisters, and a flamethrower. Requires Brige access to open."
|
||||
cost = 1500
|
||||
access = ACCESS_HEADS
|
||||
contains = list(/obj/item/flamethrower/full,
|
||||
@@ -576,7 +578,8 @@
|
||||
/obj/item/tank/internals/plasma,
|
||||
/obj/item/grenade/chem_grenade/incendiary,
|
||||
/obj/item/grenade/chem_grenade/incendiary,
|
||||
/obj/item/grenade/chem_grenade/incendiary)
|
||||
/obj/item/grenade/chem_grenade/incendiary,
|
||||
/obj/item/storage/box/fireshot)
|
||||
crate_name = "incendiary weapons crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
dangerous = TRUE
|
||||
@@ -629,11 +632,13 @@
|
||||
|
||||
/datum/supply_pack/security/armory/riotshotguns
|
||||
name = "Riot Shotgun Crate"
|
||||
desc = "For when the greytide gets really uppity. Contains three riot Shotguns. Requires Armory access to open."
|
||||
desc = "For when the greytide gets really uppity. Contains three riot shotguns, seven rubber shot and beanbag shells. Requires Armory access to open."
|
||||
cost = 6000
|
||||
contains = list(/obj/item/gun/ballistic/shotgun/riot,
|
||||
/obj/item/gun/ballistic/shotgun/riot,
|
||||
/obj/item/gun/ballistic/shotgun/riot)
|
||||
/obj/item/gun/ballistic/shotgun/riot,
|
||||
/obj/item/storage/box/rubbershot,
|
||||
/obj/item/storage/box/beanbag)
|
||||
crate_name = "riot shotgun crate"
|
||||
|
||||
/datum/supply_pack/security/armory/swat
|
||||
@@ -750,13 +755,24 @@
|
||||
|
||||
/datum/supply_pack/engineering/engihardsuit
|
||||
name = "Engineering Hardsuit"
|
||||
desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and maks!"
|
||||
desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and mask!"
|
||||
cost = 2500
|
||||
contains = list(/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/space/hardsuit/engine)
|
||||
crate_name = "engineering hardsuit"
|
||||
|
||||
/datum/supply_pack/engineering/atmoshardsuit
|
||||
name = "Atmospherics Hardsuit"
|
||||
desc = "Too many techs and not enough hardsuits? Time to buy some more! Comes with gas mask and air tank. Ask the CE to open."
|
||||
cost = 5000
|
||||
access = ACCESS_CE
|
||||
contains = list(/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/space/hardsuit/engine/atmos)
|
||||
crate_name = "atmospherics hardsuit"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
|
||||
/datum/supply_pack/engineering/industrialrcd
|
||||
name = "Industrial RCD"
|
||||
desc = "A industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Dose not contain spare ammo for the industrial RCD or any other RCD modles."
|
||||
@@ -1141,7 +1157,7 @@
|
||||
/datum/supply_pack/materials/bz
|
||||
name = "BZ Canister Crate"
|
||||
desc = "Contains a canister of BZ. Requires Toxins access to open."
|
||||
cost = 5000
|
||||
cost = 7500 // Costs 3 credits more than what you can get for selling it.
|
||||
access = ACCESS_TOX_STORAGE
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/bz)
|
||||
crate_name = "BZ canister crate"
|
||||
@@ -1540,6 +1556,15 @@
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
dangerous = TRUE
|
||||
|
||||
/datum/supply_pack/science/tech_slugs
|
||||
name = "Tech Slug Ammo Shells"
|
||||
desc = "A new type of shell that is able to be made into a few different dangerous types. Contains two boxes of tech slugs, 14 shells in all."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/box/techsslug,
|
||||
/obj/item/storage/box/techsslug)
|
||||
crate_name = "tech slug crate"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Service //////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1935,6 +1960,17 @@
|
||||
crate_name = "hydroponics backpack crate"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
/datum/supply_pack/organic/mre
|
||||
name = "MRE supply kit (emergency rations)"
|
||||
desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/storage/box/mre/menu1/safe,
|
||||
/obj/item/storage/box/mre/menu1/safe,
|
||||
/obj/item/storage/box/mre/menu2/safe,
|
||||
/obj/item/storage/box/mre/menu2/safe,
|
||||
/obj/item/storage/box/mre/menu3)
|
||||
crate_name = "MRE crate (emergency rations)"
|
||||
|
||||
/datum/supply_pack/organic/pizza
|
||||
name = "Pizza Crate"
|
||||
desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!"
|
||||
@@ -2227,7 +2263,8 @@
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims,
|
||||
/obj/item/clothing/mask/gas/syndicate,
|
||||
/obj/item/clothing/neck/necklace/dope,
|
||||
/obj/item/vending_refill/donksoft)
|
||||
/obj/item/vending_refill/donksoft,
|
||||
/obj/item/circuitboard/computer/arcade/amputation)
|
||||
crate_name = "crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/foamforce
|
||||
@@ -2679,6 +2716,7 @@
|
||||
/obj/item/restraints/handcuffs/fake/kinky,
|
||||
/obj/item/clothing/head/kitty/genuine, // Why its illegal
|
||||
/obj/item/clothing/head/kitty/genuine,
|
||||
/obj/item/storage/pill_bottle/penis_enlargement,
|
||||
/obj/structure/reagent_dispensers/keg/aphro)
|
||||
crate_name = "lewd kit"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
@@ -2713,6 +2751,19 @@
|
||||
/obj/item/pen/fountain)
|
||||
crate_name = "Paperwork"
|
||||
|
||||
/datum/supply_pack/misc/randomised/promiscuous
|
||||
name = "Promiscuous Organs"
|
||||
desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick."
|
||||
cost = 4000 //Only get 2!
|
||||
contraband = TRUE
|
||||
var/num_contained = 2
|
||||
contains = list(/obj/item/autosurgeon/penis,
|
||||
/obj/item/autosurgeon/testicles,
|
||||
/obj/item/autosurgeon/vagina,
|
||||
/obj/item/autosurgeon/breasts,
|
||||
/obj/item/autosurgeon/womb)
|
||||
crate_name = "promiscuous organs"
|
||||
|
||||
/datum/supply_pack/misc/toner
|
||||
name = "Toner Crate"
|
||||
desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'"
|
||||
|
||||
@@ -467,6 +467,24 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
"stamp-law" = 'icons/stamp_icons/large_stamp-law.png'
|
||||
)
|
||||
|
||||
/datum/asset/spritesheet/simple/minesweeper
|
||||
name = "minesweeper"
|
||||
assets = list(
|
||||
"1" = 'icons/misc/minesweeper_tiles/one.png',
|
||||
"2" = 'icons/misc/minesweeper_tiles/two.png',
|
||||
"3" = 'icons/misc/minesweeper_tiles/three.png',
|
||||
"4" = 'icons/misc/minesweeper_tiles/four.png',
|
||||
"5" = 'icons/misc/minesweeper_tiles/five.png',
|
||||
"6" = 'icons/misc/minesweeper_tiles/six.png',
|
||||
"7" = 'icons/misc/minesweeper_tiles/seven.png',
|
||||
"8" = 'icons/misc/minesweeper_tiles/eight.png',
|
||||
"empty" = 'icons/misc/minesweeper_tiles/empty.png',
|
||||
"flag" = 'icons/misc/minesweeper_tiles/flag.png',
|
||||
"hidden" = 'icons/misc/minesweeper_tiles/hidden.png',
|
||||
"mine" = 'icons/misc/minesweeper_tiles/mine.png',
|
||||
"minehit" = 'icons/misc/minesweeper_tiles/minehit.png'
|
||||
)
|
||||
|
||||
/datum/asset/simple/IRV
|
||||
assets = list(
|
||||
"jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js',
|
||||
|
||||
@@ -59,6 +59,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/preferred_map = null
|
||||
var/pda_style = MONO
|
||||
var/pda_color = "#808000"
|
||||
var/pda_skin = PDA_SKIN_ALT
|
||||
|
||||
var/uses_glasses_colour = 0
|
||||
|
||||
@@ -685,48 +686,48 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
else
|
||||
if(pref_species.use_skintones)
|
||||
dat += "<b>Genitals use skintone:</b><a href='?_src_=prefs;preference=genital_colour'>[features["genitals_use_skintone"] == TRUE ? "Yes" : "No"]</a>"
|
||||
dat += "<b>Has Penis:</b>"
|
||||
dat += "<h3>Penis</h3>"
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=has_cock'>[features["has_cock"] == TRUE ? "Yes" : "No"]</a>"
|
||||
if(features["has_cock"] == TRUE)
|
||||
if(features["has_cock"])
|
||||
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
|
||||
dat += "<b>Penis Color:</b>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'> </span>(Skin tone overriding)<br>"
|
||||
dat += "<b>Penis Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'> </span>(Skin tone overriding)</a><br>"
|
||||
else
|
||||
dat += "<b>Penis Color:</b>"
|
||||
dat += "<b>Penis Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["cock_color"]];'> </span> <a href='?_src_=prefs;preference=cock_color;task=input'>Change</a><br>"
|
||||
dat += "<b>Penis Shape:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=cock_shape;task=input'>[features["cock_shape"]]</a>"
|
||||
dat += "<b>Penis Length:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=cock_length;task=input'>[features["cock_length"]] inch(es)</a>"
|
||||
dat += "<b>Has Testicles:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=has_balls'>[features["has_balls"] == TRUE ? "Yes" : "No"]</a>"
|
||||
if(features["has_balls"] == TRUE)
|
||||
if(features["has_balls"])
|
||||
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
|
||||
dat += "<b>Testicles Color:</b>"
|
||||
dat += "<b>Testicles Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'> </span>(Skin tone overriding)<br>"
|
||||
else
|
||||
dat += "<b>Testicles Color:</b>"
|
||||
dat += "<b>Testicles Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'> </span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><br>"
|
||||
dat += "<b>Testicles showing:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_shape;task=input'>[features["balls_shape"]]</a>"
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
dat += "<b>Has Vagina:</b>"
|
||||
dat += "<h3>Vagina</h3>"
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=has_vag'>[features["has_vag"] == TRUE ? "Yes" : "No"]</a>"
|
||||
if(features["has_vag"])
|
||||
dat += "<b>Vagina Type:</b> <a style='display:block;width:100px' href='?_src_=prefs;preference=vag_shape;task=input'>[features["vag_shape"]]</a>"
|
||||
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
|
||||
dat += "<b>Vagina Color:</b>"
|
||||
dat += "<b>Vagina Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'> </span>(Skin tone overriding)<br>"
|
||||
else
|
||||
dat += "<b>Vagina Color:</b>"
|
||||
dat += "<b>Vagina Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'> </span> <a href='?_src_=prefs;preference=vag_color;task=input'>Change</a><br>"
|
||||
dat += "<b>Has Womb:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=has_womb'>[features["has_womb"] == TRUE ? "Yes" : "No"]</a>"
|
||||
dat += "</td>"
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
dat += "<b>Has Breasts:</b>"
|
||||
dat += "<h3>Breasts</h3>"
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=has_breasts'>[features["has_breasts"] == TRUE ? "Yes" : "No"]</a>"
|
||||
if(features["has_breasts"])
|
||||
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
|
||||
dat += "<b>Color:</b>"
|
||||
dat += "<b>Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'> </span>(Skin tone overriding)<br>"
|
||||
else
|
||||
dat += "<b>Color:</b>"
|
||||
dat += "<b>Color:</b></a><BR>"
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'> </span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a><br>"
|
||||
dat += "<b>Cup Size:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a>"
|
||||
dat += "<b>Breast Shape:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a>"
|
||||
@@ -746,6 +747,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<br>"
|
||||
dat += "<b>PDA Color:</b> <span style='border:1px solid #161616; background-color: [pda_color];'> </span> <a href='?_src_=prefs;preference=pda_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>PDA Style:</b> <a href='?_src_=prefs;task=input;preference=pda_style'>[pda_style]</a><br>"
|
||||
dat += "<b>PDA Reskin:</b> <a href='?_src_=prefs;task=input;preference=pda_skin'>[pda_skin]</a><br>"
|
||||
dat += "<br>"
|
||||
dat += "<b>Ghost Ears:</b> <a href='?_src_=prefs;preference=ghost_ears'>[(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</a><br>"
|
||||
dat += "<b>Ghost Radio:</b> <a href='?_src_=prefs;preference=ghost_radio'>[(chat_toggles & CHAT_GHOSTRADIO) ? "All Messages":"No Messages"]</a><br>"
|
||||
@@ -1986,6 +1988,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/pickedPDAColor = input(user, "Choose your PDA Interface color.", "Character Preference",pda_color) as color|null
|
||||
if(pickedPDAColor)
|
||||
pda_color = pickedPDAColor
|
||||
if("pda_skin")
|
||||
var/pickedPDASkin = input(user, "Choose your PDA reskin.", "Character Preference", pda_skin) as null|anything in GLOB.pda_reskins
|
||||
if(pickedPDASkin)
|
||||
pda_skin = pickedPDASkin
|
||||
|
||||
else
|
||||
switch(href_list["preference"])
|
||||
@@ -1996,6 +2002,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
arousable = !arousable
|
||||
if("has_cock")
|
||||
features["has_cock"] = !features["has_cock"]
|
||||
if(features["has_cock"] == FALSE)
|
||||
features["has_balls"] = FALSE
|
||||
if("has_balls")
|
||||
features["has_balls"] = !features["has_balls"]
|
||||
if("has_ovi")
|
||||
@@ -2010,6 +2018,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["has_breasts"] = !features["has_breasts"]
|
||||
if("has_vag")
|
||||
features["has_vag"] = !features["has_vag"]
|
||||
if(features["has_vag"] == FALSE)
|
||||
features["has_womb"] = FALSE
|
||||
if("has_womb")
|
||||
features["has_womb"] = !features["has_womb"]
|
||||
if("exhibitionist")
|
||||
@@ -2236,8 +2246,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
character.hair_style = hair_style
|
||||
character.facial_hair_style = facial_hair_style
|
||||
character.underwear = underwear
|
||||
character.saved_underwear = underwear
|
||||
character.undershirt = undershirt
|
||||
character.saved_undershirt = undershirt
|
||||
character.socks = socks
|
||||
character.saved_socks = socks
|
||||
|
||||
character.backbag = backbag
|
||||
|
||||
|
||||
@@ -108,6 +108,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["tip_delay"] >> tip_delay
|
||||
S["pda_style"] >> pda_style
|
||||
S["pda_color"] >> pda_color
|
||||
S["pda_skin"] >> pda_skin
|
||||
|
||||
//citadel code
|
||||
S["arousable"] >> arousable
|
||||
@@ -144,6 +145,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
be_special = SANITIZE_LIST(be_special)
|
||||
pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style))
|
||||
pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color))
|
||||
pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT)
|
||||
|
||||
screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake))
|
||||
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
|
||||
@@ -200,6 +202,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["tip_delay"], tip_delay)
|
||||
WRITE_FILE(S["pda_style"], pda_style)
|
||||
WRITE_FILE(S["pda_color"], pda_color)
|
||||
WRITE_FILE(S["pda_skin"], pda_skin)
|
||||
|
||||
//citadel code
|
||||
WRITE_FILE(S["screenshake"], screenshake)
|
||||
|
||||
@@ -226,6 +226,19 @@
|
||||
CL.flags_cover = initial(PCL.flags_cover)
|
||||
target.icon = initial(picked_item.icon)
|
||||
|
||||
/datum/action/item_action/chameleon/change/pda/update_item(obj/item/pda/picked_item)
|
||||
if(!istype(target, /obj/item/pda))
|
||||
return ..()
|
||||
var/obj/item/pda/P = target
|
||||
P.name = initial(picked_item.name)
|
||||
P.desc = initial(picked_item.desc)
|
||||
P.icon_state = initial(picked_item.icon_state)
|
||||
P.item_state = initial(picked_item.item_state)
|
||||
P.item_color = initial(picked_item.item_color)
|
||||
P.overlays_offsets = initial(picked_item.overlays_offsets)
|
||||
P.set_new_overlays()
|
||||
P.update_icon()
|
||||
|
||||
/datum/action/item_action/chameleon/change/Trigger()
|
||||
if(!IsAvailable())
|
||||
return
|
||||
@@ -584,7 +597,7 @@
|
||||
|
||||
/obj/item/pda/chameleon
|
||||
name = "PDA"
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
var/datum/action/item_action/chameleon/change/pda/chameleon_action
|
||||
|
||||
/obj/item/pda/chameleon/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -216,6 +216,34 @@ BLIND // can't see anything
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/clothing/under/CtrlClick(mob/user)
|
||||
. = ..()
|
||||
|
||||
if (!(item_flags & IN_INVENTORY))
|
||||
return
|
||||
|
||||
if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
|
||||
if(has_sensor == LOCKED_SENSORS)
|
||||
to_chat(user, "The controls are locked.")
|
||||
return
|
||||
if(has_sensor == BROKEN_SENSORS)
|
||||
to_chat(user, "The sensors have shorted out!")
|
||||
return
|
||||
if(has_sensor <= NO_SENSORS)
|
||||
to_chat(user, "This suit does not have any sensors.")
|
||||
return
|
||||
|
||||
sensor_mode = SENSOR_COORDS
|
||||
|
||||
to_chat(user, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.w_uniform == src)
|
||||
H.update_suit_sensors()
|
||||
|
||||
/obj/item/clothing/under/AltClick(mob/user)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents."
|
||||
icon_state = "purple"
|
||||
item_state = "glasses"
|
||||
scan_reagents = 1 //You can see reagents while wearing science goggles
|
||||
scan_reagents = TRUE //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 = ACID_PROOF
|
||||
@@ -202,7 +202,7 @@
|
||||
/obj/item/clothing/glasses/sunglasses/reagent
|
||||
name = "beer goggles"
|
||||
desc = "A pair of sunglasses outfitted with apparatus to scan reagents."
|
||||
scan_reagents = 1
|
||||
scan_reagents = TRUE
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/garb
|
||||
name = "black gar glasses"
|
||||
@@ -377,7 +377,7 @@
|
||||
item_state = "godeye"
|
||||
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
darkness_view = 8
|
||||
scan_reagents = 1
|
||||
scan_reagents = TRUE
|
||||
item_flags = NODROP
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
//defines the drill hat's yelling setting
|
||||
#define DRILL_DEFAULT "default"
|
||||
#define DRILL_SHOUTING "shouting"
|
||||
#define DRILL_YELLING "yelling"
|
||||
#define DRILL_CANADIAN "canadian"
|
||||
|
||||
//Chef
|
||||
/obj/item/clothing/head/chefhat
|
||||
@@ -148,6 +153,65 @@
|
||||
strip_delay = 60
|
||||
dog_fashion = /datum/dog_fashion/head/warden
|
||||
|
||||
/obj/item/clothing/head/warden/drill
|
||||
name = "warden's campaign hat"
|
||||
desc = "A special armored campaign hat with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection. Has the letters 'FMJ' enscribed on its side."
|
||||
icon_state = "wardendrill"
|
||||
item_state = "wardendrill"
|
||||
dog_fashion = null
|
||||
var/mode = DRILL_DEFAULT
|
||||
|
||||
/obj/item/clothing/head/warden/drill/screwdriver_act(mob/living/carbon/human/user, obj/item/I)
|
||||
if(..())
|
||||
return TRUE
|
||||
switch(mode)
|
||||
if(DRILL_DEFAULT)
|
||||
to_chat(user, "<span class='notice'>You set the voice circuit to the middle position.</span>")
|
||||
mode = DRILL_SHOUTING
|
||||
if(DRILL_SHOUTING)
|
||||
to_chat(user, "<span class='notice'>You set the voice circuit to the last position.</span>")
|
||||
mode = DRILL_YELLING
|
||||
if(DRILL_YELLING)
|
||||
to_chat(user, "<span class='notice'>You set the voice circuit to the first position.</span>")
|
||||
mode = DRILL_DEFAULT
|
||||
if(DRILL_CANADIAN)
|
||||
to_chat(user, "<span class='danger'>You adjust voice circuit but nothing happens, probably because it's broken.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/warden/drill/wirecutter_act(mob/living/user, obj/item/I)
|
||||
if(mode != DRILL_CANADIAN)
|
||||
to_chat(user, "<span class='danger'>You broke the voice circuit!</span>")
|
||||
mode = DRILL_CANADIAN
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/warden/drill/speechModification(M)
|
||||
if(copytext(M, 1, 2) != "*")
|
||||
if(mode == DRILL_DEFAULT)
|
||||
M = " [M]"
|
||||
return trim(M)
|
||||
if(mode == DRILL_SHOUTING)
|
||||
M = " [M]!"
|
||||
return trim(M)
|
||||
if(mode == DRILL_YELLING)
|
||||
M = " [M]!!"
|
||||
return trim(M)
|
||||
if(mode == DRILL_CANADIAN)
|
||||
M = " [M]"
|
||||
var/list/canadian_words = strings("canadian_replacement.json", "canadian")
|
||||
|
||||
for(var/key in canadian_words)
|
||||
var/value = canadian_words[key]
|
||||
if(islist(value))
|
||||
value = pick(value)
|
||||
|
||||
M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]")
|
||||
M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]")
|
||||
M = replacetextEx(M, " [key]", " [value]")
|
||||
|
||||
if(prob(30))
|
||||
M += pick(", eh?", ", EH?")
|
||||
return trim(M)
|
||||
|
||||
/obj/item/clothing/head/beret/sec
|
||||
name = "security beret"
|
||||
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
|
||||
@@ -201,3 +265,8 @@
|
||||
name = "quartermaster's beret"
|
||||
desc = "This headwear shows off your Cargonian leadership"
|
||||
icon_state = "qmberet"
|
||||
|
||||
#undef DRILL_DEFAULT
|
||||
#undef DRILL_SHOUTING
|
||||
#undef DRILL_YELLING
|
||||
#undef DRILL_CANADIAN
|
||||
|
||||
@@ -445,7 +445,7 @@
|
||||
flash_protect = 0
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
scan_reagents = 1
|
||||
scan_reagents = TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/medical
|
||||
icon_state = "hardsuit-medical"
|
||||
@@ -467,7 +467,7 @@
|
||||
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)
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
scan_reagents = 1
|
||||
scan_reagents = TRUE
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize()
|
||||
@@ -626,7 +626,7 @@
|
||||
item_state = "anc_hardsuit"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
|
||||
slowdown = 6 //Slow
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
@@ -639,7 +639,7 @@
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
|
||||
item_color = "ancient"
|
||||
brightness_on = 16
|
||||
scan_reagents = 1
|
||||
scan_reagents = TRUE
|
||||
flash_protect = 5 //We will not be flash by bombs
|
||||
tint = 1
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
|
||||
@@ -58,7 +58,8 @@
|
||||
item_state = "hostrench"
|
||||
flags_inv = 0
|
||||
strip_delay = 80
|
||||
|
||||
unique_reskin = list("Coat" = "hostrench", "Cloak" = "trenchcloak")
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/warden
|
||||
name = "warden's jacket"
|
||||
desc = "A navy-blue armored jacket with blue shoulder designations and '/Warden/' stitched into one of the chest pockets."
|
||||
|
||||
@@ -124,6 +124,9 @@
|
||||
icon_state = "suitjacket_black"
|
||||
item_state = "ro_suit"
|
||||
|
||||
/obj/item/clothing/suit/toggle/lawyer/black/syndie
|
||||
desc = "A snappy dress jacket. Suspiciously has no tags or branding."
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40)
|
||||
|
||||
//Mime
|
||||
/obj/item/clothing/suit/suspenders
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -21,7 +21,7 @@
|
||||
CAT_BURGER,
|
||||
CAT_CAKE,
|
||||
CAT_EGG,
|
||||
CAT_SUSHI, //Called Fish
|
||||
CAT_FISH,
|
||||
CAT_ICE, //Called Frozen
|
||||
CAT_MEAT,
|
||||
CAT_MISCFOOD,
|
||||
|
||||
@@ -365,28 +365,6 @@
|
||||
parts = list(/obj/item/camera = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/lizardhat
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
time = 10
|
||||
reqs = list(/obj/item/organ/tail/lizard = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/lizardhat_alternate
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
time = 10
|
||||
reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/kittyears
|
||||
name = "Kitty Ears"
|
||||
result = /obj/item/clothing/head/kitty/genuine
|
||||
time = 10
|
||||
reqs = list(/obj/item/organ/tail/cat = 1,
|
||||
/obj/item/organ/ears/cat = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/skateboard
|
||||
name = "Skateboard"
|
||||
result = /obj/vehicle/ridden/scooter/skateboard
|
||||
@@ -641,6 +619,15 @@
|
||||
/obj/item/assembly/igniter = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
|
||||
/datum/crafting_recipe/wheelchair
|
||||
name = "Wheelchair"
|
||||
result = /obj/vehicle/ridden/wheelchair
|
||||
reqs = list(/obj/item/stack/sheet/plasteel = 2,
|
||||
/obj/item/stack/rods = 8)
|
||||
time = 100
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/rcl
|
||||
name = "Makeshift Rapid Cable Layer"
|
||||
result = /obj/item/twohanded/rcl/ghetto
|
||||
@@ -672,6 +659,28 @@
|
||||
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/lizardhat
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
time = 10
|
||||
reqs = list(/obj/item/organ/tail/lizard = 1)
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/lizardhat_alternate
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
time = 10
|
||||
reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/kittyears
|
||||
name = "Kitty Ears"
|
||||
result = /obj/item/clothing/head/kitty/genuine
|
||||
time = 10
|
||||
reqs = list(/obj/item/organ/tail/cat = 1,
|
||||
/obj/item/organ/ears/cat = 1)
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/hudsunsec
|
||||
name = "Security HUDsunglasses"
|
||||
result = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
@@ -781,3 +790,36 @@
|
||||
/datum/reagent/water = 15)
|
||||
time = 40
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/smartdart
|
||||
name = "Medical smartdart"
|
||||
result = /obj/item/reagent_containers/syringe/dart
|
||||
reqs = list(/obj/item/stack/sheet/metal = 1,
|
||||
/obj/item/stack/sheet/glass = 1,
|
||||
/obj/item/stack/sheet/plastic = 1)
|
||||
time = 10
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/medolier
|
||||
name = "Medolier"
|
||||
result = /obj/item/storage/belt/medolier
|
||||
reqs = list(/obj/item/stack/sheet/metal = 2,
|
||||
/obj/item/stack/sheet/cloth = 3,
|
||||
/obj/item/stack/sheet/plastic = 4)
|
||||
time = 30
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/smartdartgun
|
||||
name = "Smart dartgun"
|
||||
result = /obj/item/gun/syringe/dart
|
||||
reqs = list(/obj/item/stack/sheet/metal = 15,
|
||||
/obj/item/stack/sheet/glass = 10,
|
||||
/obj/item/tank/internals = 1,
|
||||
/obj/item/reagent_containers/glass/beaker = 1,
|
||||
/obj/item/stack/sheet/plastic = 10,
|
||||
/obj/item/stack/cable_coil = 2)
|
||||
time = 150 //It's a gun
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
@@ -45,6 +45,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
throwforce = 100
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/mob/living/wizard
|
||||
var/z_original = 0
|
||||
var/destination
|
||||
var/notify = TRUE
|
||||
@@ -140,3 +141,23 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
H.adjustBruteLoss(160)
|
||||
if(L && (L.density || prob(10)))
|
||||
L.ex_act(EXPLODE_HEAVY)
|
||||
|
||||
obj/effect/immovablerod/attack_hand(mob/living/user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/U = user
|
||||
if(U.job in list("Research Director"))
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
|
||||
for(var/mob/M in urange(8, src))
|
||||
if(!M.stat)
|
||||
shake_camera(M, 2, 3)
|
||||
if(wizard)
|
||||
U.visible_message("<span class='boldwarning'>[src] transforms into [wizard] as [U] suplexes them!</span>", "<span class='warning'>As you grab [src], it suddenly turns into [wizard] as you suplex them!</span>")
|
||||
to_chat(wizard, "<span class='boldwarning'>You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!</span>")
|
||||
wizard.Stun(60)
|
||||
wizard.apply_damage(25, BRUTE)
|
||||
qdel(src)
|
||||
else
|
||||
U.visible_message("<span class='boldwarning'>[U] suplexes [src] into the ground!</span>", "<span class='warning'>You suplex [src] into the ground!</span>")
|
||||
new /obj/structure/festivus/anchored(drop_location())
|
||||
new /obj/effect/anomaly/flux(drop_location())
|
||||
qdel(src)
|
||||
|
||||
@@ -204,6 +204,14 @@
|
||||
resistance_flags = FREEZE_PROOF
|
||||
isGlass = FALSE
|
||||
|
||||
//Used by MREs
|
||||
/obj/item/reagent_containers/food/drinks/coffee/type2
|
||||
name = "\improper Coffee, instant (type 2)"
|
||||
desc = "Coffee that's been blow dried into a granulated powder. This packet includes self heating water for your nutritional pleasure."
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "condi_cornoil"
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/ice
|
||||
name = "ice cup"
|
||||
desc = "Careful, cold ice, do not chew."
|
||||
@@ -507,6 +515,13 @@
|
||||
list_reagents = list("shamblers" = 30)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
|
||||
name = "Grey Bull"
|
||||
desc = "Grey Bull, it gives you gloves!"
|
||||
icon_state = "energy_drink"
|
||||
list_reagents = list("grey_bull" = 20)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/air
|
||||
name = "canned air"
|
||||
desc = "There is no air shortage. Do not drink."
|
||||
|
||||
@@ -330,6 +330,33 @@
|
||||
icon_state = "fernetbottle"
|
||||
list_reagents = list("fernet" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/applejack
|
||||
name = "Buckin' Bronco's Applejack"
|
||||
desc = "Kicks like a horse, tastes like an apple!"
|
||||
icon_state = "applejack_bottle"
|
||||
list_reagents = list("applejack" = 100)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/champagne
|
||||
name = "Eau d' Dandy Brut Champagne"
|
||||
desc = "Finely sourced from only the most pretentious French vineyards."
|
||||
icon_state = "champagne_bottle"
|
||||
list_reagents = list("champagne" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/blazaam
|
||||
name = "Ginbad's Blazaam"
|
||||
desc = "You feel like you should give the bottle a good rub before opening."
|
||||
icon_state = "blazaambottle"
|
||||
list_reagents = list("blazaam" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/trappist
|
||||
name = "Mont de Requin Trappistes Bleu"
|
||||
desc = "Brewed in space-Belgium. Fancy!"
|
||||
icon_state = "trappistbottle"
|
||||
volume = 50
|
||||
list_reagents = list("trappist" = 50)
|
||||
|
||||
|
||||
//////////////////////////JUICES AND STUFF ///////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
icon_state = R.glass_icon_state
|
||||
else
|
||||
var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "glassoverlay")
|
||||
icon_state = "glass_empty"
|
||||
reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(reagent_overlay)
|
||||
else
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
volume = 10
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list()
|
||||
possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"))
|
||||
possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"), "astrotame" = list("condi_astrotame", "Astrotame", "The sweetness of a thousand sugars but none of the calories."))
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
|
||||
return
|
||||
@@ -287,3 +287,8 @@
|
||||
name = "hotsauce pack"
|
||||
originalname = "hotsauce"
|
||||
list_reagents = list("capsaicin" = 10)
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/pack/astrotame
|
||||
name = "astrotame pack"
|
||||
originalname = "astrotame"
|
||||
list_reagents = list("astrotame" = 5)
|
||||
|
||||
@@ -291,19 +291,23 @@ All foods are distributed among various categories. Use common sense.
|
||||
S.reagents.add_reagent(r_id, amount)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/microwave_act(obj/machinery/microwave/M)
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/item/result
|
||||
if(cooked_type)
|
||||
var/obj/item/reagent_containers/food/snacks/S = new cooked_type(get_turf(src))
|
||||
if(M)
|
||||
initialize_cooked_food(S, M.efficiency)
|
||||
result = new cooked_type(T)
|
||||
if(istype(M))
|
||||
initialize_cooked_food(result, M.efficiency)
|
||||
else
|
||||
initialize_cooked_food(S, 1)
|
||||
SSblackbox.record_feedback("tally", "food_made", 1, type)
|
||||
initialize_cooked_food(result, 1)
|
||||
SSblackbox.record_feedback("tally", "food_made", 1, result.type)
|
||||
else
|
||||
new /obj/item/reagent_containers/food/snacks/badrecipe(src)
|
||||
if(M && M.dirty < 100)
|
||||
result = new /obj/item/reagent_containers/food/snacks/badrecipe(T)
|
||||
if(istype(M) && M.dirty < 100)
|
||||
M.dirty++
|
||||
qdel(src)
|
||||
|
||||
return result
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/Destroy()
|
||||
if(contents)
|
||||
for(var/atom/movable/something in contents)
|
||||
|
||||
@@ -558,3 +558,19 @@
|
||||
list_reagents = list("nutriment" = 6, "sodiumchloride" = 2)
|
||||
tastes = list("rice" = 3, "salt" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cannedpeaches
|
||||
name = "Canned Peaches"
|
||||
desc = "Just a nice can of ripe peaches swimming in their own juices."
|
||||
icon_state = "peachcan"
|
||||
list_reagents = list("peachjuice" = 20, "sugar" = 8, "nutriment" = 2)
|
||||
filling_color = "#ffdf26"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
tastes = list("peaches" = 7, "tin" = 1)
|
||||
foodtype = FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cannedpeaches/maint
|
||||
name = "Maintenance Peaches"
|
||||
desc = "I have a mouth and I must eat."
|
||||
icon_state = "peachcanmaint"
|
||||
tastes = list("peaches" = 1, "tin" = 7)
|
||||
@@ -8,27 +8,34 @@
|
||||
icon_state = "donut1"
|
||||
bitesize = 5
|
||||
bonus_reagents = list("sugar" = 1)
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 2)
|
||||
var/extra_reagent = null
|
||||
list_reagents = list("nutriment" = 3, "sprinkles" = 1, "sugar" = 2)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("donut" = 1)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
|
||||
var/frosted_icon = "donut2"
|
||||
var/is_frosted = FALSE
|
||||
var/extra_reagent = null
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/Initialize()
|
||||
. = ..()
|
||||
if(prob(30))
|
||||
icon_state = "donut2"
|
||||
name = "frosted donut"
|
||||
reagents.add_reagent("sprinkles", 2)
|
||||
bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
|
||||
filling_color = "#FF69B4"
|
||||
frost_donut()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/proc/frost_donut()
|
||||
if(is_frosted || !frosted_icon)
|
||||
return
|
||||
is_frosted = TRUE
|
||||
name = "frosted [name]"
|
||||
icon_state = frosted_icon //delish~!
|
||||
reagents.add_reagent("sprinkles", 1)
|
||||
filling_color = "#FF69B4"
|
||||
return TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/checkLiked(fraction, mob/M) //Sec officers always love donuts
|
||||
if(last_check_time + 50 < world.time)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.mind && H.mind.assigned_role == "Security Officer" || H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Warden" || H.mind.assigned_role == "Head of Security" && !HAS_TRAIT(H, TRAIT_AGEUSIA))
|
||||
if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM) && !HAS_TRAIT(H, TRAIT_AGEUSIA))
|
||||
to_chat(H,"<span class='notice'>I love this taste!</span>")
|
||||
H.adjust_disgust(-5 + -2.5 * fraction)
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
|
||||
@@ -48,18 +55,12 @@
|
||||
. = ..()
|
||||
extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
|
||||
reagents.add_reagent("[extra_reagent]", 3)
|
||||
bonus_reagents = list("[extra_reagent]" = 3, "sugar" = 1)
|
||||
if(prob(30))
|
||||
icon_state = "donut2"
|
||||
name = "frosted chaos donut"
|
||||
reagents.add_reagent("sprinkles", 2)
|
||||
bonus_reagents = list("sprinkles" = 2, "[extra_reagent]" = 3, "sugar" = 1)
|
||||
filling_color = "#FF69B4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
frosted_icon = "jdonut2"
|
||||
bonus_reagents = list("sugar" = 1, "vitamin" = 1)
|
||||
extra_reagent = "berryjuice"
|
||||
tastes = list("jelly" = 1, "donut" = 3)
|
||||
@@ -69,12 +70,6 @@
|
||||
. = ..()
|
||||
if(extra_reagent)
|
||||
reagents.add_reagent("[extra_reagent]", 3)
|
||||
if(prob(30))
|
||||
icon_state = "jdonut2"
|
||||
name = "frosted jelly Donut"
|
||||
reagents.add_reagent("sprinkles", 2)
|
||||
bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
|
||||
filling_color = "#FF69B4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
|
||||
name = "jelly donut"
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
H.adjust_blurriness(1)
|
||||
H.visible_message("<span class='warning'>[H] is creamed by [src]!</span>", "<span class='userdanger'>You've been creamed by [src]!</span>")
|
||||
playsound(H, "desceration", 50, TRUE)
|
||||
reagents.trans_to(H,15) //Transfers the cream pies total volume of reagents to target on it
|
||||
if(!H.creamed) // one layer at a time
|
||||
H.add_overlay(creamoverlay)
|
||||
H.creamed = TRUE
|
||||
@@ -268,3 +269,24 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
|
||||
tastes = list("mint" = 1, "pie" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pie/baklava
|
||||
name = "baklava"
|
||||
desc = "A delightful healthy snake made of nut layers with thin bread."
|
||||
icon_state = "baklava"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/baklavaslice
|
||||
slices_num = 6
|
||||
bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
|
||||
tastes = list("nuts" = 1, "pie" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/baklavaslice
|
||||
name = "baklava dish"
|
||||
desc = "A portion delightful healthy snake made of nut layers with thin bread"
|
||||
icon = 'icons/obj/food/piecake.dmi'
|
||||
icon_state = "baklavaslice"
|
||||
trash = /obj/item/trash/plate
|
||||
filling_color = "#1E90FF"
|
||||
list_reagents = list("nutriment" = 2, "vitamins" = 4)
|
||||
tastes = list("nuts" = 1, "pie" = 1)
|
||||
foodtype = GRAIN
|
||||
@@ -225,3 +225,12 @@
|
||||
filling_color = "#FFFFFF"
|
||||
foodtype = GRAIN | VEGETABLES
|
||||
|
||||
|
||||
// Used by MREs
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/pepperoni
|
||||
name = "\improper MRE pepperoni pizza slice"
|
||||
desc = "A freeze dried, dehydrated slice of bread with tomato sauce, pepperoni and cheese."
|
||||
icon_state = "meatpizzaslice"
|
||||
filling_color = "#A52A2A"
|
||||
tastes = list("cardboard" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT
|
||||
@@ -12,322 +12,343 @@
|
||||
pass_flags = PASSTABLE
|
||||
light_color = LIGHT_COLOR_YELLOW
|
||||
light_power = 0.9
|
||||
var/wire_disabled = FALSE // is its internal wire cut?
|
||||
var/operating = FALSE // Is it on?
|
||||
var/dirty = 0 // = {0..100} Does it need cleaning?
|
||||
var/broken = 0 // ={0,1,2} How broken is it???
|
||||
var/max_n_of_items = 10 // whatever fat fuck made this a global var needs to look at themselves in the mirror sometime
|
||||
var/dirty = 0 // 0 to 100 // Does it need cleaning?
|
||||
var/dirty_anim_playing = FALSE
|
||||
var/broken = 0 // 0, 1 or 2 // How broken is it???
|
||||
var/max_n_of_items = 10
|
||||
var/efficiency = 0
|
||||
var/datum/looping_sound/microwave/soundloop
|
||||
var/list/ingredients = list() // may only contain /atom/movables
|
||||
|
||||
//Microwaving doesn't use recipes, instead it calls the microwave_act of the objects. For food, this creates something based on the food's cooked_type
|
||||
var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine")
|
||||
var/static/radial_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject")
|
||||
var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use")
|
||||
|
||||
/*******************
|
||||
* Initialising
|
||||
********************/
|
||||
// we show the button even if the proc will not work
|
||||
var/static/list/radial_options = list("eject" = radial_eject, "use" = radial_use)
|
||||
var/static/list/ai_radial_options = list("eject" = radial_eject, "use" = radial_use, "examine" = radial_examine)
|
||||
|
||||
/obj/machinery/microwave/Initialize()
|
||||
. = ..()
|
||||
wires = new /datum/wires/microwave(src)
|
||||
create_reagents(100)
|
||||
soundloop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/microwave/Destroy()
|
||||
eject()
|
||||
if(wires)
|
||||
QDEL_NULL(wires)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/microwave/RefreshParts()
|
||||
var/E
|
||||
var/max_items = 10
|
||||
efficiency = 0
|
||||
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
|
||||
E += M.rating
|
||||
efficiency += M.rating
|
||||
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
|
||||
max_items = 10 * M.rating
|
||||
efficiency = E
|
||||
max_n_of_items = max_items
|
||||
max_n_of_items = 10 * M.rating
|
||||
break
|
||||
|
||||
/obj/machinery/microwave/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!operating)
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to turn it on.</span>")
|
||||
|
||||
/*******************
|
||||
* Item Adding
|
||||
********************/
|
||||
if(!in_range(user, src) && !issilicon(user) && !isobserver(user))
|
||||
to_chat(user, "<span class='warning'>You're too far away to examine [src]'s contents and display!</span>")
|
||||
return
|
||||
if(operating)
|
||||
to_chat(user, "<span class='notice'>\The [src] is operating.</span>")
|
||||
return
|
||||
|
||||
if(length(ingredients))
|
||||
if(issilicon(user))
|
||||
to_chat(user, "<span class='notice'>\The [src] camera shows:</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] contains:</span>")
|
||||
var/list/items_counts = new
|
||||
for(var/i in ingredients)
|
||||
if(istype(i, /obj/item/stack))
|
||||
var/obj/item/stack/S = i
|
||||
items_counts[S.name] += S.amount
|
||||
else
|
||||
var/atom/movable/AM = i
|
||||
items_counts[AM.name]++
|
||||
for(var/O in items_counts)
|
||||
to_chat(user, "<span class='notice'>- [items_counts[O]]x [O].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] is empty.</span>")
|
||||
|
||||
if(!(stat & (NOPOWER|BROKEN)))
|
||||
to_chat(user, "<span class='notice'>The status display reads:</span>")
|
||||
to_chat(user, "<span class='notice'>- Capacity: <b>[max_n_of_items]</b> items.<span>")
|
||||
to_chat(user, "<span class='notice'>- Cook time reduced by <b>[(efficiency - 1) * 25]%</b>.<span>")
|
||||
|
||||
/obj/machinery/microwave/update_icon()
|
||||
if(broken)
|
||||
icon_state = "mwb"
|
||||
else if(dirty_anim_playing)
|
||||
icon_state = "mwbloody1"
|
||||
else if(dirty == 100)
|
||||
icon_state = "mwbloody"
|
||||
else if(operating)
|
||||
icon_state = "mw1"
|
||||
else if(panel_open)
|
||||
icon_state = "mw-o"
|
||||
else
|
||||
icon_state = "mw"
|
||||
|
||||
/obj/machinery/microwave/attackby(obj/item/O, mob/user, params)
|
||||
if(operating)
|
||||
return
|
||||
if(!broken && dirty<100)
|
||||
if(default_deconstruction_screwdriver(user, "mw-o", "mw", O))
|
||||
return
|
||||
if(default_unfasten_wrench(user, O))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(O))
|
||||
return
|
||||
|
||||
if(src.broken > 0)
|
||||
if(src.broken == 2 && istype(O, /obj/item/wirecutters)) // If it's broken and they're using a screwdriver
|
||||
user.visible_message( \
|
||||
"[user] starts to fix part of the microwave.", \
|
||||
"<span class='notice'>You start to fix part of the microwave...</span>" \
|
||||
)
|
||||
if (O.use_tool(src, user, 20))
|
||||
user.visible_message( \
|
||||
"[user] fixes part of the microwave.", \
|
||||
"<span class='notice'>You fix part of the microwave.</span>" \
|
||||
)
|
||||
src.broken = 1 // Fix it a bit
|
||||
else if(src.broken == 1 && istype(O, /obj/item/weldingtool)) // If it's broken and they're doing the wrench
|
||||
user.visible_message( \
|
||||
"[user] starts to fix part of the microwave.", \
|
||||
"<span class='notice'>You start to fix part of the microwave...</span>" \
|
||||
)
|
||||
if (O.use_tool(src, user, 20))
|
||||
user.visible_message( \
|
||||
"[user] fixes the microwave.", \
|
||||
"<span class='notice'>You fix the microwave.</span>" \
|
||||
)
|
||||
src.icon_state = "mw"
|
||||
src.broken = 0 // Fix it!
|
||||
src.dirty = 0 // just to be sure
|
||||
return 0 //to use some fuel
|
||||
if(dirty < 100)
|
||||
if(default_deconstruction_screwdriver(user, icon_state, icon_state, O) || default_unfasten_wrench(user, O))
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(panel_open && is_wire_tool(O))
|
||||
wires.interact(user)
|
||||
return TRUE
|
||||
|
||||
if(broken > 0)
|
||||
if(broken == 2 && O.tool_behaviour == TOOL_WIRECUTTER) // If it's broken and they're using a screwdriver
|
||||
user.visible_message("[user] starts to fix part of \the [src].", "<span class='notice'>You start to fix part of \the [src]...</span>")
|
||||
if(O.use_tool(src, user, 20))
|
||||
user.visible_message("[user] fixes part of \the [src].", "<span class='notice'>You fix part of \the [src].</span>")
|
||||
broken = 1 // Fix it a bit
|
||||
else if(broken == 1 && O.tool_behaviour == TOOL_WELDER) // If it's broken and they're doing the wrench
|
||||
user.visible_message("[user] starts to fix part of \the [src].", "<span class='notice'>You start to fix part of \the [src]...</span>")
|
||||
if(O.use_tool(src, user, 20))
|
||||
user.visible_message("[user] fixes \the [src].", "<span class='notice'>You fix \the [src].</span>")
|
||||
broken = 0
|
||||
update_icon()
|
||||
return FALSE //to use some fuel
|
||||
else
|
||||
to_chat(user, "<span class='warning'>It's broken!</span>")
|
||||
return 1
|
||||
else if(istype(O, /obj/item/reagent_containers/spray/))
|
||||
return TRUE
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/reagent_containers/spray))
|
||||
var/obj/item/reagent_containers/spray/clean_spray = O
|
||||
if(clean_spray.reagents.has_reagent("cleaner",clean_spray.amount_per_transfer_from_this))
|
||||
clean_spray.reagents.remove_reagent("cleaner",clean_spray.amount_per_transfer_from_this,1)
|
||||
if(clean_spray.reagents.has_reagent("cleaner", clean_spray.amount_per_transfer_from_this))
|
||||
clean_spray.reagents.remove_reagent("cleaner", clean_spray.amount_per_transfer_from_this,1)
|
||||
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
|
||||
user.visible_message( \
|
||||
"[user] has cleaned the microwave.", \
|
||||
"<span class='notice'>You clean the microwave.</span>" \
|
||||
)
|
||||
src.dirty = 0 // It's clean!
|
||||
src.broken = 0 // just to be sure
|
||||
src.icon_state = "mw"
|
||||
src.updateUsrDialog()
|
||||
return 1 // Disables the after-attack so we don't spray the floor/user.
|
||||
user.visible_message("[user] has cleaned \the [src].", "<span class='notice'>You clean \the [src].</span>")
|
||||
dirty = 0
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need more space cleaner!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
else if(istype(O, /obj/item/soap/)) // If they're trying to clean it then let them
|
||||
if(istype(O, /obj/item/soap))
|
||||
var/obj/item/soap/P = O
|
||||
user.visible_message( \
|
||||
"[user] starts to clean the microwave.", \
|
||||
"<span class='notice'>You start to clean the microwave...</span>" \
|
||||
)
|
||||
if (do_after(user, P.cleanspeed, target = src))
|
||||
user.visible_message( \
|
||||
"[user] has cleaned the microwave.", \
|
||||
"<span class='notice'>You clean the microwave.</span>" \
|
||||
)
|
||||
src.dirty = 0 // It's clean!
|
||||
src.broken = 0 // just to be sure
|
||||
src.icon_state = "mw"
|
||||
user.visible_message("[user] starts to clean \the [src].", "<span class='notice'>You start to clean \the [src]...</span>")
|
||||
if(do_after(user, P.cleanspeed, target = src))
|
||||
user.visible_message("[user] has cleaned \the [src].", "<span class='notice'>You clean \the [src].</span>")
|
||||
dirty = 0
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
else if(src.dirty==100) // The microwave is all dirty so can't be used!
|
||||
to_chat(user, "<span class='warning'>It's dirty!</span>")
|
||||
return 1
|
||||
if(dirty == 100) // The microwave is all dirty so can't be used!
|
||||
to_chat(user, "<span class='warning'>\The [src] is dirty!</span>")
|
||||
return TRUE
|
||||
|
||||
else if(istype(O, /obj/item/storage/bag/tray))
|
||||
if(istype(O, /obj/item/storage/bag/tray))
|
||||
var/obj/item/storage/T = O
|
||||
var/loaded = 0
|
||||
for(var/obj/item/reagent_containers/food/snacks/S in T.contents)
|
||||
if (contents.len>=max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>[src] is full, you can't put anything in!</span>")
|
||||
return 1
|
||||
if(ingredients.len >= max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>\The [src] is full, you can't put anything in!</span>")
|
||||
return TRUE
|
||||
if(SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src))
|
||||
loaded++
|
||||
|
||||
ingredients += S
|
||||
if(loaded)
|
||||
to_chat(user, "<span class='notice'>You insert [loaded] items into [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You insert [loaded] items into \the [src].</span>")
|
||||
return
|
||||
|
||||
if(O.w_class <= WEIGHT_CLASS_NORMAL && !istype(O, /obj/item/storage) && user.a_intent == INTENT_HELP)
|
||||
if(ingredients.len >= max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>\The [src] is full, you can't put anything in!</span>")
|
||||
return TRUE
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
to_chat(user, "<span class='warning'>\The [O] is stuck to your hand!</span>")
|
||||
return FALSE
|
||||
|
||||
else if(O.w_class <= WEIGHT_CLASS_NORMAL && !istype(O, /obj/item/storage) && user.a_intent == INTENT_HELP)
|
||||
if (contents.len>=max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>[src] is full, you can't put anything in!</span>")
|
||||
return 1
|
||||
else
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
to_chat(user, "<span class='warning'>\the [O] is stuck to your hand, you cannot put it in \the [src]!</span>")
|
||||
return 0
|
||||
ingredients += O
|
||||
user.visible_message("[user] has added \a [O] to \the [src].", "<span class='notice'>You add [O] to \the [src].</span>")
|
||||
return
|
||||
|
||||
user.visible_message( \
|
||||
"[user] has added \the [O] to \the [src].", \
|
||||
"<span class='notice'>You add \the [O] to \the [src].</span>")
|
||||
|
||||
else
|
||||
..()
|
||||
updateUsrDialog()
|
||||
..()
|
||||
|
||||
/obj/machinery/microwave/AltClick(mob/user)
|
||||
if(user.canUseTopic(src, BE_CLOSE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
|
||||
if(user.canUseTopic(src, !issilicon(usr)))
|
||||
cook()
|
||||
|
||||
/*******************
|
||||
* Microwave Menu
|
||||
********************/
|
||||
|
||||
/obj/machinery/microwave/ui_interact(mob/user) // The microwave Menu
|
||||
/obj/machinery/microwave/ui_interact(mob/user)
|
||||
. = ..()
|
||||
if(panel_open || !anchored)
|
||||
|
||||
if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user)))
|
||||
return
|
||||
if(isAI(user) && (stat & NOPOWER))
|
||||
return
|
||||
var/dat = "<div class='statusDisplay'>"
|
||||
if(broken > 0)
|
||||
dat += "ERROR: 09734014-A2379-D18746 --Bad memory<BR>Contact your operator or use command line to rebase memory ///git checkout {HEAD} -a commit pull --rebase push {*NEW HEAD*}</div>" //Thats how all the git fiddling looks to me
|
||||
else if(operating)
|
||||
dat += "Microwaving in progress!<BR>Please wait...!</div>"
|
||||
else if(dirty==100)
|
||||
dat += "ERROR: >> 0 --Response input zero<BR>Contact your operator of the device manifactor support.</div>"
|
||||
else
|
||||
var/list/items_counts = new
|
||||
for (var/obj/O in contents)
|
||||
if(istype(O, /obj/item/stack/))
|
||||
var/obj/item/stack/S = O
|
||||
items_counts[O.name] += S.amount
|
||||
else
|
||||
items_counts[O.name]++
|
||||
|
||||
for (var/O in items_counts)
|
||||
var/N = items_counts[O]
|
||||
dat += "[capitalize(O)]: [N]<BR>"
|
||||
|
||||
if (items_counts.len==0)
|
||||
dat += "The microwave is empty.</div>"
|
||||
if(!length(ingredients))
|
||||
if(isAI(user))
|
||||
examine(user)
|
||||
else
|
||||
dat = "<h3>Ingredients:</h3>[dat]</div>"
|
||||
dat += "<A href='?src=[REF(src)];action=cook'>Turn on</A>"
|
||||
dat += "<A href='?src=[REF(src)];action=dispose'>Eject ingredients</A><BR>"
|
||||
to_chat(user, "<span class='warning'>\The [src] is empty.</span>")
|
||||
return
|
||||
|
||||
var/datum/browser/popup = new(user, "microwave", name, 300, 300)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user))
|
||||
|
||||
/***********************************
|
||||
* Microwave Menu Handling/Cooking
|
||||
************************************/
|
||||
// post choice verification
|
||||
if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user)))
|
||||
return
|
||||
if(isAI(user) && (stat & NOPOWER))
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
switch(choice)
|
||||
if("eject")
|
||||
eject()
|
||||
if("use")
|
||||
cook()
|
||||
if("examine")
|
||||
examine(user)
|
||||
|
||||
/obj/machinery/microwave/proc/eject()
|
||||
for(var/i in ingredients)
|
||||
var/atom/movable/AM = i
|
||||
AM.forceMove(drop_location())
|
||||
ingredients.Cut()
|
||||
|
||||
/obj/machinery/microwave/proc/cook()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(operating || broken > 0 || panel_open || !anchored || dirty == 100)
|
||||
return
|
||||
|
||||
if(wire_disabled)
|
||||
audible_message("[src] buzzes.")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
return
|
||||
|
||||
if(prob(max((5 / efficiency) - 5, dirty * 5))) //a clean unupgraded microwave has no risk of failure
|
||||
muck()
|
||||
return
|
||||
for(var/obj/O in ingredients)
|
||||
if(istype(O, /obj/item/reagent_containers/food) || istype(O, /obj/item/grown))
|
||||
continue
|
||||
if(prob(min(dirty * 5, 100)))
|
||||
start_can_fail()
|
||||
return
|
||||
break
|
||||
start()
|
||||
|
||||
if (prob(max(5/efficiency-5,dirty*5))) //a clean unupgraded microwave has no risk of failure
|
||||
muck_start()
|
||||
if (!microwaving(4))
|
||||
muck_finish()
|
||||
return
|
||||
muck_finish()
|
||||
return
|
||||
/obj/machinery/microwave/proc/turn_on()
|
||||
visible_message("\The [src] turns on.", "<span class='italics'>You hear a microwave humming.</span>")
|
||||
operating = TRUE
|
||||
|
||||
else
|
||||
if(has_extra_item() && prob(min(dirty*5,100)) && !microwaving(4))
|
||||
broke()
|
||||
return
|
||||
set_light(1.5)
|
||||
soundloop.start()
|
||||
update_icon()
|
||||
|
||||
if(!microwaving(10))
|
||||
abort()
|
||||
return
|
||||
stop()
|
||||
/obj/machinery/microwave/proc/spark()
|
||||
visible_message("<span class='warning'>Sparks fly around [src]!</span>")
|
||||
var/datum/effect_system/spark_spread/s = new
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
|
||||
var/metal = 0
|
||||
for(var/obj/item/O in contents)
|
||||
O.microwave_act(src)
|
||||
if(O.materials[MAT_METAL])
|
||||
metal += O.materials[MAT_METAL]
|
||||
|
||||
if(metal)
|
||||
visible_message("<span class='warning'>Sparks fly around [src]!</span>")
|
||||
if(prob(max(metal/2, 33)))
|
||||
explosion(loc,0,1,2)
|
||||
broke()
|
||||
return
|
||||
|
||||
dropContents()
|
||||
return
|
||||
|
||||
/obj/machinery/microwave/proc/microwaving(seconds as num)
|
||||
for (var/i=1 to seconds)
|
||||
if (stat & (NOPOWER|BROKEN))
|
||||
return 0
|
||||
use_power(500)
|
||||
sleep(max(12-2*efficiency,2)) // standard microwave means sleep(10). The better the efficiency, the faster the cooking
|
||||
return 1
|
||||
|
||||
/obj/machinery/microwave/proc/has_extra_item()
|
||||
for (var/obj/O in contents)
|
||||
if ( \
|
||||
!istype(O, /obj/item/reagent_containers/food) && \
|
||||
!istype(O, /obj/item/grown) \
|
||||
)
|
||||
return 1
|
||||
return 0
|
||||
#define MICROWAVE_NORMAL 0
|
||||
#define MICROWAVE_MUCK 1
|
||||
#define MICROWAVE_PRE 2
|
||||
|
||||
/obj/machinery/microwave/proc/start()
|
||||
visible_message("The microwave turns on.", "<span class='italics'>You hear a microwave humming.</span>")
|
||||
soundloop.start()
|
||||
operating = TRUE
|
||||
icon_state = "mw1"
|
||||
set_light(1.5)
|
||||
updateUsrDialog()
|
||||
turn_on()
|
||||
loop(MICROWAVE_NORMAL, 10)
|
||||
|
||||
/obj/machinery/microwave/proc/abort()
|
||||
operating = FALSE // Turn it off again aferwards
|
||||
icon_state = "mw"
|
||||
updateUsrDialog()
|
||||
set_light(0)
|
||||
soundloop.stop()
|
||||
/obj/machinery/microwave/proc/start_can_fail()
|
||||
turn_on()
|
||||
loop(MICROWAVE_PRE, 4)
|
||||
|
||||
/obj/machinery/microwave/proc/stop()
|
||||
abort()
|
||||
/obj/machinery/microwave/proc/muck()
|
||||
turn_on()
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
dirty_anim_playing = TRUE
|
||||
update_icon()
|
||||
loop(MICROWAVE_MUCK, 4)
|
||||
|
||||
/obj/machinery/microwave/proc/dispose()
|
||||
for (var/obj/O in contents)
|
||||
O.forceMove(drop_location())
|
||||
to_chat(usr, "<span class='notice'>You dispose of the microwave contents.</span>")
|
||||
updateUsrDialog()
|
||||
/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2)) // standard wait is 10
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(MICROWAVE_PRE)
|
||||
pre_fail()
|
||||
return
|
||||
if(!time)
|
||||
switch(type)
|
||||
if(MICROWAVE_NORMAL)
|
||||
loop_finish()
|
||||
if(MICROWAVE_MUCK)
|
||||
muck_finish()
|
||||
if(MICROWAVE_PRE)
|
||||
pre_success()
|
||||
return
|
||||
time--
|
||||
use_power(500)
|
||||
addtimer(CALLBACK(src, .proc/loop, type, time, wait), wait)
|
||||
|
||||
/obj/machinery/microwave/proc/muck_start()
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
|
||||
icon_state = "mwbloody1" // Make it look dirty!!
|
||||
/obj/machinery/microwave/proc/loop_finish()
|
||||
operating = FALSE
|
||||
|
||||
var/metal = 0
|
||||
for(var/obj/item/O in ingredients)
|
||||
O.microwave_act(src)
|
||||
if(O.materials[MAT_METAL])
|
||||
metal += O.materials[MAT_METAL]
|
||||
|
||||
if(metal)
|
||||
spark()
|
||||
broken = 2
|
||||
if(prob(max(metal / 2, 33)))
|
||||
explosion(loc, 0, 1, 2)
|
||||
else
|
||||
dropContents(ingredients)
|
||||
ingredients.Cut()
|
||||
|
||||
after_finish_loop()
|
||||
|
||||
/obj/machinery/microwave/proc/pre_fail()
|
||||
broken = 2
|
||||
operating = FALSE
|
||||
spark()
|
||||
after_finish_loop()
|
||||
|
||||
/obj/machinery/microwave/proc/pre_success()
|
||||
loop(MICROWAVE_NORMAL, 10)
|
||||
|
||||
/obj/machinery/microwave/proc/muck_finish()
|
||||
visible_message("<span class='warning'>The microwave gets covered in muck!</span>")
|
||||
dirty = 100 // Make it dirty so it can't be used util cleaned
|
||||
icon_state = "mwbloody" // Make it look dirty too
|
||||
operating = FALSE // Turn it off again aferwards
|
||||
updateUsrDialog()
|
||||
visible_message("<span class='warning'>\The [src] gets covered in muck!</span>")
|
||||
|
||||
dirty = 100
|
||||
dirty_anim_playing = FALSE
|
||||
operating = FALSE
|
||||
|
||||
for(var/obj/item/reagent_containers/food/snacks/S in src)
|
||||
if(prob(50))
|
||||
new /obj/item/reagent_containers/food/snacks/badrecipe(src)
|
||||
qdel(S)
|
||||
|
||||
after_finish_loop()
|
||||
|
||||
/obj/machinery/microwave/proc/after_finish_loop()
|
||||
set_light(0)
|
||||
soundloop.stop()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/microwave/proc/broke()
|
||||
var/datum/effect_system/spark_spread/s = new
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
icon_state = "mwb" // Make it look all busted up and shit
|
||||
visible_message("<span class='warning'>The microwave breaks!</span>") //Let them know they're stupid
|
||||
broken = 2 // Make it broken so it can't be used util fixed
|
||||
flags_1 = null //So you can't add condiments
|
||||
operating = FALSE // Turn it off again aferwards
|
||||
updateUsrDialog()
|
||||
set_light(0)
|
||||
soundloop.stop()
|
||||
|
||||
/obj/machinery/microwave/Topic(href, href_list)
|
||||
if(..() || panel_open)
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
if(operating)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
switch(href_list["action"])
|
||||
if ("cook")
|
||||
cook()
|
||||
|
||||
if ("dispose")
|
||||
dispose()
|
||||
updateUsrDialog()
|
||||
#undef MICROWAVE_NORMAL
|
||||
#undef MICROWAVE_MUCK
|
||||
#undef MICROWAVE_PRE
|
||||
@@ -15,6 +15,7 @@
|
||||
var/max_n_of_items = 1500
|
||||
var/allow_ai_retrieve = FALSE
|
||||
var/list/initial_contents
|
||||
var/visible_contents = TRUE
|
||||
|
||||
/obj/machinery/smartfridge/Initialize()
|
||||
. = ..()
|
||||
@@ -37,11 +38,21 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/smartfridge/update_icon()
|
||||
var/startstate = initial(icon_state)
|
||||
if(!stat)
|
||||
icon_state = startstate
|
||||
if(visible_contents)
|
||||
switch(contents.len)
|
||||
if(0)
|
||||
icon_state = "[initial(icon_state)]"
|
||||
if(1 to 25)
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
if(26 to 75)
|
||||
icon_state = "[initial(icon_state)]2"
|
||||
if(76 to INFINITY)
|
||||
icon_state = "[initial(icon_state)]3"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]"
|
||||
else
|
||||
icon_state = "[startstate]-off"
|
||||
icon_state = "[initial(icon_state)]-off"
|
||||
|
||||
|
||||
|
||||
@@ -50,7 +61,14 @@
|
||||
********************/
|
||||
|
||||
/obj/machinery/smartfridge/attackby(obj/item/O, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "smartfridge_open", "smartfridge", O))
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
if(default_deconstruction_screwdriver(user, icon_state, icon_state, O))
|
||||
cut_overlays()
|
||||
if(panel_open)
|
||||
add_overlay("[initial(icon_state)]-panel")
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(default_pry_open(O))
|
||||
@@ -64,49 +82,46 @@
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(!stat)
|
||||
|
||||
if(contents.len >= max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>\The [src] is full!</span>")
|
||||
return FALSE
|
||||
|
||||
if(accept_check(O))
|
||||
load(O)
|
||||
user.visible_message("[user] has added \the [O] to \the [src].", "<span class='notice'>You add \the [O] to \the [src].</span>")
|
||||
updateUsrDialog()
|
||||
return TRUE
|
||||
|
||||
if(istype(O, /obj/item/storage/bag))
|
||||
var/obj/item/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].", \
|
||||
"<span class='notice'>You fill \the [src] with \the [O].</span>")
|
||||
else
|
||||
user.visible_message("[user] loads \the [src] with \the [O].", \
|
||||
"<span class='notice'>You load \the [src] with \the [O].</span>")
|
||||
if(O.contents.len > 0)
|
||||
to_chat(user, "<span class='warning'>Some items are refused.</span>")
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is nothing in [O] to put in [src]!</span>")
|
||||
return FALSE
|
||||
|
||||
if(user.a_intent != INTENT_HARM)
|
||||
to_chat(user, "<span class='warning'>\The [src] smartly refuses [O].</span>")
|
||||
if(stat)
|
||||
updateUsrDialog()
|
||||
return FALSE
|
||||
else
|
||||
return ..()
|
||||
|
||||
if(contents.len >= max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>\The [src] is full!</span>")
|
||||
return FALSE
|
||||
|
||||
if(accept_check(O))
|
||||
load(O)
|
||||
user.visible_message("[user] has added \the [O] to \the [src].", "<span class='notice'>You add \the [O] to \the [src].</span>")
|
||||
updateUsrDialog()
|
||||
if (visible_contents)
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
if(istype(O, /obj/item/storage/bag))
|
||||
var/obj/item/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)
|
||||
user.visible_message("[user] loads \the [src] with \the [O].", \
|
||||
"<span class='notice'>You [contents.len >= max_n_of_items ? "fill" : "load"] \the [src] with \the [O].</span>")
|
||||
if(O.contents.len > 0)
|
||||
to_chat(user, "<span class='warning'>Some items are refused.</span>")
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is nothing in [O] to put in [src]!</span>")
|
||||
return FALSE
|
||||
|
||||
to_chat(user, "<span class='warning'>\The [src] smartly refuses [O].</span>")
|
||||
updateUsrDialog()
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
@@ -186,6 +201,8 @@
|
||||
O.forceMove(drop_location())
|
||||
adjust_item_drop_location(O)
|
||||
break
|
||||
if (visible_contents)
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
for(var/obj/item/O in src)
|
||||
@@ -195,6 +212,8 @@
|
||||
O.forceMove(drop_location())
|
||||
adjust_item_drop_location(O)
|
||||
desired--
|
||||
if (visible_contents)
|
||||
update_icon()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -210,6 +229,7 @@
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 200
|
||||
visible_contents = FALSE
|
||||
var/drying = FALSE
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/Initialize()
|
||||
@@ -414,6 +434,7 @@
|
||||
name = "disk compartmentalizer"
|
||||
desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)."
|
||||
icon_state = "disktoaster"
|
||||
visible_contents = FALSE
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
/obj/machinery/smartfridge/disks/accept_check(obj/item/O)
|
||||
|
||||
@@ -332,6 +332,12 @@
|
||||
/obj/item/pizzabox/infinite/proc/attune_pizza(mob/living/carbon/human/noms) //tonight on "proc names I never thought I'd type"
|
||||
if(!pizza_preferences[noms.ckey])
|
||||
pizza_preferences[noms.ckey] = pickweight(pizza_types)
|
||||
if(noms.has_quirk(/datum/quirk/pineapple_liker))
|
||||
pizza_preferences[noms.ckey] = /obj/item/reagent_containers/food/snacks/pizza/pineapple
|
||||
else if(noms.has_quirk(/datum/quirk/pineapple_hater))
|
||||
var/list/pineapple_pizza_liker = pizza_types.Copy()
|
||||
pineapple_pizza_liker -= /obj/item/reagent_containers/food/snacks/pizza/pineapple
|
||||
pizza_preferences[noms.ckey] = pickweight(pineapple_pizza_liker)
|
||||
if(noms.mind && noms.mind.assigned_role == "Botanist")
|
||||
pizza_preferences[noms.ckey] = /obj/item/reagent_containers/food/snacks/pizza/dank
|
||||
|
||||
|
||||
@@ -152,8 +152,8 @@
|
||||
/datum/chemical_reaction/beepsky_smash
|
||||
name = "Beepksy Smash"
|
||||
id = "beepksysmash"
|
||||
results = list("beepskysmash" = 4)
|
||||
required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1)
|
||||
results = list("beepskysmash" = 5)
|
||||
required_reagents = list("limejuice" = 2, "quadruple_sec" = 2, "iron" = 1)
|
||||
|
||||
/datum/chemical_reaction/doctor_delight
|
||||
name = "The Doctor's Delight"
|
||||
@@ -532,11 +532,18 @@
|
||||
required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1)
|
||||
mix_message = "<span class='warning'>The mixture turns to a sickening froth.</span>"
|
||||
|
||||
/datum/chemical_reaction/lemonade
|
||||
name = "Lemonade"
|
||||
id = "lemonade"
|
||||
results = list("lemonade" = 5)
|
||||
required_reagents = list("lemonjuice" = 2, "water" = 2, "sugar" = 1, "ice" = 1)
|
||||
mix_message = "You're suddenly reminded of home."
|
||||
|
||||
/datum/chemical_reaction/arnold_palmer
|
||||
name = "Arnold Palmer"
|
||||
id = "arnold_palmer"
|
||||
results = list("arnold_palmer" = 2)
|
||||
required_reagents = list("tea" = 1, "lemonjuice" = 1)
|
||||
required_reagents = list("tea" = 1, "lemonade" = 1)
|
||||
mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange."
|
||||
|
||||
/datum/chemical_reaction/chocolate_milk
|
||||
@@ -704,3 +711,87 @@
|
||||
id = "pinktea"
|
||||
results = list("pinktea" = 5)
|
||||
required_reagents = list("aphro" = 1, "arnold_palmer" = 1, "sugar" = 1)
|
||||
|
||||
/datum/chemical_reaction/blank_paper
|
||||
name = "Blank Paper"
|
||||
id = "blank_paper"
|
||||
results = list("blank_paper" = 3)
|
||||
required_reagents = list("silencer" = 1, "nothing" = 1, "nuka_cola" = 1)
|
||||
|
||||
/datum/chemical_reaction/wizz_fizz
|
||||
name = "Wizz Fizz"
|
||||
id = "wizz_fizz"
|
||||
results = list("wizz_fizz" = 3)
|
||||
required_reagents = list("triple_sec" = 1, "sodawater" = 1, "champagne" = 1)
|
||||
mix_message = "The beverage starts to froth with an almost mystical zeal!"
|
||||
mix_sound = 'sound/effects/bubbles2.ogg'
|
||||
|
||||
/datum/chemical_reaction/bug_spray
|
||||
name = "Bug Spray"
|
||||
id = "bug_spray"
|
||||
results = list("bug_spray" = 5)
|
||||
required_reagents = list("triple_sec" = 2, "lemon_lime" = 1, "rum" = 2, "vodka" = 1)
|
||||
mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?"
|
||||
mix_sound = 'sound/creatures/bee.ogg'
|
||||
|
||||
/datum/chemical_reaction/jack_rose
|
||||
name = "Jack Rose"
|
||||
id = "jack_rose"
|
||||
results = list("jack_rose" = 4)
|
||||
required_reagents = list("grenadine" = 1, "applejack" = 2, "limejuice" = 1)
|
||||
mix_message = "As the grenadine incorporates, the beverage takes on a mellow, red-orange glow."
|
||||
|
||||
/datum/chemical_reaction/turbo
|
||||
name = "Turbo"
|
||||
id = "turbo"
|
||||
results = list("turbo" = 5)
|
||||
required_reagents = list("moonshine" = 2, "nitrous_oxide" = 1, "sugar_rush" = 1, "pwr_game" = 1)
|
||||
|
||||
/datum/chemical_reaction/old_timer
|
||||
name = "Old Timer"
|
||||
id = "old_timer"
|
||||
results = list("old_timer" = 6)
|
||||
required_reagents = list("whiskeysoda" = 3, "parsnipjuice" = 2, "alexander" = 1)
|
||||
|
||||
/datum/chemical_reaction/rubberneck
|
||||
name = "Rubberneck"
|
||||
id = "rubberneck"
|
||||
results = list("rubberneck" = 10)
|
||||
required_reagents = list("ethanol" = 4, "grey_bull" = 5, "astrotame" = 1)
|
||||
|
||||
/datum/chemical_reaction/duplex
|
||||
name = "Duplex"
|
||||
id = "duplex"
|
||||
results = list("duplex" = 4)
|
||||
required_reagents = list("hcider" = 2, "applejuice" = 1, "berryjuice" = 1)
|
||||
|
||||
/datum/chemical_reaction/trappist
|
||||
name = "Trappist"
|
||||
id = "trappist"
|
||||
results = list("trappist" = 5)
|
||||
required_reagents = list("ale" = 2, "holywater" = 2, "sugar" = 1)
|
||||
|
||||
/datum/chemical_reaction/cream_soda
|
||||
name = "Cream Soda"
|
||||
id = "cream_soda"
|
||||
results = list("cream_soda" = 4)
|
||||
required_reagents = list("sugar" = 2, "sodawater" = 2, "vanilla" = 1)
|
||||
|
||||
/datum/chemical_reaction/blazaam
|
||||
name = "Blazaam"
|
||||
id = "blazaam"
|
||||
results = list("blazaam" = 3)
|
||||
required_reagents = list("gin" = 2, "peachjuice" = 1, "bluespace" = 1)
|
||||
|
||||
/datum/chemical_reaction/planet_cracker
|
||||
name = "Planet Cracker"
|
||||
id = "planet_cracker"
|
||||
results = list("planet_cracker" = 4)
|
||||
required_reagents = list("champagne" = 2, "lizardwine" = 2, "eggyolk" = 1, "gold" = 1)
|
||||
mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited."
|
||||
|
||||
/datum/chemical_reaction/red_queen
|
||||
name = "Red Queen"
|
||||
id = "red_queen"
|
||||
results = list("red_queen" = 10)
|
||||
required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1)
|
||||
@@ -38,37 +38,6 @@
|
||||
|
||||
// see code/module/crafting/table.dm
|
||||
|
||||
////////////////////////////////////////////////FISH////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/cubancarp
|
||||
name = "Cuban carp"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/flour = 5,
|
||||
/obj/item/reagent_containers/food/snacks/grown/chili = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/cubancarp
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/fishandchips
|
||||
name = "Fish and chips"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/fries = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/fishandchips
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/fishfingers
|
||||
name = "Fish fingers"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/flour = 5,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/fishfingers
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/spidereggsham
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donut
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/donut
|
||||
time = 15
|
||||
name = "Semen donut"
|
||||
@@ -104,7 +104,7 @@ datum/crafting_recipe/food/donut/meat
|
||||
/datum/crafting_recipe/food/rofflewaffles
|
||||
name = "Roffle waffles"
|
||||
reqs = list(
|
||||
/datum/reagent/mushroomhallucinogen = 5,
|
||||
/datum/reagent/drug/mushroomhallucinogen = 5,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 2
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/rofflewaffles
|
||||
@@ -205,16 +205,6 @@ datum/crafting_recipe/food/donut/meat
|
||||
|
||||
////////////////////////////////////////////OTHER////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/hotdog
|
||||
name = "Hot dog"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/ketchup = 5,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1,
|
||||
/obj/item/reagent_containers/food/snacks/sausage = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/hotdog
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/meatbun
|
||||
name = "Meat bun"
|
||||
reqs = list(
|
||||
|
||||
@@ -159,3 +159,13 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/pie/frostypie
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/baklava
|
||||
name = "Baklava pie"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/butter = 1,
|
||||
/obj/item/reagent_containers/food/snacks/tortilla = 4, //Layers
|
||||
/obj/item/seeds/wheat/oat = 3
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/pie/baklava
|
||||
subcategory = CAT_PIE
|
||||
@@ -94,7 +94,7 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/notasandwich
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/notasandwich
|
||||
/datum/crafting_recipe/food/tunasandwich
|
||||
name = "Tuna sandwich"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
@@ -104,3 +104,13 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tuna_sandwich
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/hotdog
|
||||
name = "Hot dog"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/ketchup = 5,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1,
|
||||
/obj/item/reagent_containers/food/snacks/sausage = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/hotdog
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
/datum/reagent/consumable/rice = 10
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_rice
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/sea_weed
|
||||
name = "Sea Weed Sheet"
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sea_weed
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/tuna_can
|
||||
name = "Can of Tuna"
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tuna
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
//////////////////////////Sushi/////////////////////////////////
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sashimi
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/riceball
|
||||
name = "Onigiri"
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/sushi_rice = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/riceball
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/sushie_egg
|
||||
name = "Tobiko"
|
||||
@@ -59,7 +59,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 2,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tobiko
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/sushie_basic
|
||||
name = "Funa Hosomaki"
|
||||
@@ -70,7 +70,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 3,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushie_basic
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/sushie_adv
|
||||
name = "Funa Nigiri"
|
||||
@@ -80,7 +80,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushie_adv
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/sushie_pro
|
||||
name = "Well made Funa Nigiri"
|
||||
@@ -91,4 +91,35 @@
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushie_pro
|
||||
subcategory = CAT_SUSHI
|
||||
subcategory = CAT_FISH
|
||||
|
||||
///////////////Gaijin junk/////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/fishfingers
|
||||
name = "Fish fingers"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/flour = 5,
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/fishfingers
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/cubancarp
|
||||
name = "Cuban carp"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/flour = 5,
|
||||
/obj/item/reagent_containers/food/snacks/grown/chili = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/cubancarp
|
||||
subcategory = CAT_FISH
|
||||
|
||||
/datum/crafting_recipe/food/fishandchips
|
||||
name = "Fish and chips"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/fries = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/fishandchips
|
||||
subcategory = CAT_FISH
|
||||
@@ -31,18 +31,17 @@
|
||||
decksize = 50
|
||||
card_text_file = "strings/cas_black.txt"
|
||||
|
||||
/obj/item/toy/cards/deck/cas/Initialize()
|
||||
. = ..()
|
||||
/obj/item/toy/cards/deck/cas/populate_deck()
|
||||
var/static/list/cards_against_space = list("cas_white" = world.file2list("strings/cas_white.txt"),"cas_black" = world.file2list("strings/cas_black.txt"))
|
||||
allcards = cards_against_space[card_face]
|
||||
var/list/possiblecards = allcards.Copy()
|
||||
if(possiblecards.len < decksize) // sanity check
|
||||
decksize = (possiblecards.len - 1)
|
||||
var/list/randomcards = list()
|
||||
while (randomcards.len < decksize)
|
||||
for(var/x in 1 to decksize)
|
||||
randomcards += pick_n_take(possiblecards)
|
||||
for(var/i=1 to randomcards.len)
|
||||
var/cardtext = randomcards[i]
|
||||
for(var/x in 1 to randomcards.len)
|
||||
var/cardtext = randomcards[x]
|
||||
var/datum/playingcard/P
|
||||
P = new()
|
||||
P.name = "[cardtext]"
|
||||
@@ -50,7 +49,7 @@
|
||||
cards += P
|
||||
if(!blanks)
|
||||
return
|
||||
for(var/x=1 to blanks)
|
||||
for(var/x in 1 to blanks)
|
||||
var/datum/playingcard/P
|
||||
P = new()
|
||||
P.name = "Blank Card"
|
||||
@@ -58,10 +57,7 @@
|
||||
cards += P
|
||||
shuffle_inplace(cards) // distribute blank cards throughout deck
|
||||
|
||||
/obj/item/toy/cards/deck/cas/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
/obj/item/toy/cards/deck/cas/draw_card(mob/user)
|
||||
if(user.lying)
|
||||
return
|
||||
if(cards.len == 0)
|
||||
|
||||
@@ -471,15 +471,6 @@ function ehjaxCallback(data) {
|
||||
handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid);
|
||||
}
|
||||
sendVolumeUpdate();
|
||||
} else if (data.firebug) {
|
||||
if (data.trigger) {
|
||||
internalOutput('<span class="internal boldnshit">Loading firebug console, triggered by '+data.trigger+'...</span>', 'internal');
|
||||
} else {
|
||||
internalOutput('<span class="internal boldnshit">Loading firebug console...</span>', 'internal');
|
||||
}
|
||||
var firebugEl = document.createElement('script');
|
||||
firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js';
|
||||
document.body.appendChild(firebugEl);
|
||||
} else if (data.adminMusic) {
|
||||
if (typeof data.adminMusic === 'string') {
|
||||
var adminMusic = byondDecode(data.adminMusic);
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
icon_state = "parsnip"
|
||||
bitesize_mod = 2
|
||||
foodtype = VEGETABLES
|
||||
juice_results = list("parsnipjuice" = 0)
|
||||
wine_power = 35
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ Clown
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
|
||||
/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
|
||||
. = ..()
|
||||
H.apply_pref_name("clown", M.client)
|
||||
|
||||
/datum/outfit/job/clown
|
||||
@@ -174,6 +175,8 @@ Lawyer
|
||||
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
/datum/outfit/job/lawyer
|
||||
name = "Lawyer"
|
||||
jobtype = /datum/job/lawyer
|
||||
|
||||
@@ -19,19 +19,20 @@ Chaplain
|
||||
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||
|
||||
/datum/job/chaplain/after_spawn(mob/living/H, mob/M)
|
||||
. = ..()
|
||||
if(H.mind)
|
||||
H.mind.isholy = TRUE
|
||||
|
||||
var/obj/item/storage/book/bible/booze/B = new
|
||||
|
||||
if(SSreligion.religion)
|
||||
B.deity_name = SSreligion.deity
|
||||
B.name = SSreligion.bible_name
|
||||
B.icon_state = SSreligion.bible_icon_state
|
||||
B.item_state = SSreligion.bible_item_state
|
||||
to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [SSreligion.deity]. Defer to the Chaplain.")
|
||||
if(GLOB.religion)
|
||||
B.deity_name = GLOB.deity
|
||||
B.name = GLOB.bible_name
|
||||
B.icon_state = GLOB.bible_icon_state
|
||||
B.item_state = GLOB.bible_item_state
|
||||
to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.")
|
||||
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
|
||||
var/nrt = SSreligion.holy_weapon_type || /obj/item/nullrod
|
||||
var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod
|
||||
var/obj/item/nullrod/N = new nrt(H)
|
||||
H.put_in_hands(N)
|
||||
return
|
||||
@@ -74,9 +75,9 @@ Chaplain
|
||||
else
|
||||
B.name = "The Holy Book of [new_religion]"
|
||||
|
||||
SSreligion.religion = new_religion
|
||||
SSreligion.bible_name = B.name
|
||||
SSreligion.deity = B.deity_name
|
||||
GLOB.religion = new_religion
|
||||
GLOB.bible_name = B.name
|
||||
GLOB.deity = B.deity_name
|
||||
|
||||
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
|
||||
|
||||
|
||||
@@ -54,10 +54,15 @@
|
||||
//can be overridden by antag_rep.txt config
|
||||
var/antag_rep = 10
|
||||
|
||||
var/list/mind_traits // Traits added to the mind of the mob assigned this job
|
||||
|
||||
//Only override this proc
|
||||
//H is usually a human unless an /equip override transformed it
|
||||
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
|
||||
//do actions on H but send messages to M as the key may not have been transferred_yet
|
||||
if(mind_traits)
|
||||
for(var/t in mind_traits)
|
||||
ADD_TRAIT(H.mind, t, JOB_TRAIT)
|
||||
|
||||
/datum/job/proc/announce(mob/living/carbon/human/H)
|
||||
if(head_announce)
|
||||
|
||||
@@ -35,6 +35,8 @@ Head of Security
|
||||
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
|
||||
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
/datum/outfit/job/hos
|
||||
name = "Head of Security"
|
||||
jobtype = /datum/job/hos
|
||||
@@ -92,6 +94,8 @@ Warden
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
/datum/job/warden/get_access()
|
||||
var/list/L = list()
|
||||
L = ..() | check_config_for_sec_maint()
|
||||
@@ -145,6 +149,8 @@ Detective
|
||||
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
/datum/outfit/job/detective
|
||||
name = "Detective"
|
||||
jobtype = /datum/job/detective
|
||||
@@ -198,6 +204,7 @@ Security Officer
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
/datum/job/officer/get_access()
|
||||
var/list/L = list()
|
||||
|
||||
@@ -485,11 +485,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
|
||||
if(href_list["printbible"])
|
||||
if(cooldown < world.time)
|
||||
var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible(src.loc)
|
||||
if(SSreligion.bible_icon_state && SSreligion.bible_item_state)
|
||||
B.icon_state = SSreligion.bible_icon_state
|
||||
B.item_state = SSreligion.bible_item_state
|
||||
B.name = SSreligion.bible_name
|
||||
B.deity_name = SSreligion.deity
|
||||
if(GLOB.bible_icon_state && GLOB.bible_item_state)
|
||||
B.icon_state = GLOB.bible_icon_state
|
||||
B.item_state = GLOB.bible_item_state
|
||||
B.name = GLOB.bible_name
|
||||
B.deity_name = GLOB.deity
|
||||
cooldown = world.time + PRINTER_COOLDOWN
|
||||
else
|
||||
say("Printer currently unavailable, please wait a moment.")
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
var/list/obj/machinery/atmospherics/atmos_machines = list()
|
||||
var/list/obj/structure/cable/cables = list()
|
||||
var/list/atom/atoms = list()
|
||||
var/list/area/areas = list()
|
||||
|
||||
var/list/turfs = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
|
||||
locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))
|
||||
@@ -37,6 +38,7 @@
|
||||
for(var/L in turfs)
|
||||
var/turf/B = L
|
||||
atoms += B
|
||||
areas |= B.loc
|
||||
for(var/A in B)
|
||||
atoms += A
|
||||
if(istype(A, /obj/structure/cable))
|
||||
@@ -48,6 +50,7 @@
|
||||
var/turf/T = L
|
||||
T.air_update_turf(TRUE) //calculate adjacent turfs along the border to prevent runtimes
|
||||
|
||||
SSmapping.reg_in_areas_in_z(areas)
|
||||
SSatoms.InitializeAtoms(atoms)
|
||||
SSmachines.setup_template_powernets(cables)
|
||||
SSair.setup_template_machinery(atmos_machines)
|
||||
|
||||
@@ -144,7 +144,12 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
points += inp.point_value * inp.amount
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/mineral/stacking_machine/laborstacker/attackby(obj/item/I, mob/living/user)
|
||||
if(istype(I, /obj/item/stack/sheet) && user.canUnEquip(I))
|
||||
var/obj/item/stack/sheet/inp = I
|
||||
points += inp.point_value * inp.amount
|
||||
return ..()
|
||||
|
||||
/**********************Point Lookup Console**************************/
|
||||
/obj/machinery/mineral/labor_points_checker
|
||||
name = "points checking console"
|
||||
|
||||
@@ -273,23 +273,12 @@
|
||||
to_chat(user, "<span class='notice'>You release the wisp. It begins to bob around your head.</span>")
|
||||
icon_state = "lantern"
|
||||
wisp.orbit(user, 20)
|
||||
user.update_sight()
|
||||
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed")
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You return the wisp to the lantern.</span>")
|
||||
|
||||
var/mob/target
|
||||
if(wisp.orbiting)
|
||||
target = wisp.orbiting.orbiting
|
||||
wisp.stop_orbit()
|
||||
wisp.forceMove(src)
|
||||
|
||||
if (istype(target))
|
||||
target.update_sight()
|
||||
to_chat(target, "<span class='notice'>Your vision returns to normal.</span>")
|
||||
|
||||
icon_state = "lantern-blue"
|
||||
wisp.forceMove(src)
|
||||
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned")
|
||||
|
||||
/obj/item/wisp_lantern/Initialize()
|
||||
@@ -302,7 +291,7 @@
|
||||
qdel(wisp)
|
||||
else
|
||||
wisp.visible_message("<span class='notice'>[wisp] has a sad feeling for a moment, then it passes.</span>")
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/wisp
|
||||
name = "friendly wisp"
|
||||
@@ -314,6 +303,25 @@
|
||||
var/sight_flags = SEE_MOBS
|
||||
var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
|
||||
/obj/effect/wisp/orbit(atom/thing, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
||||
. = ..()
|
||||
if(ismob(thing))
|
||||
RegisterSignal(thing, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight)
|
||||
var/mob/being = thing
|
||||
being.update_sight()
|
||||
to_chat(thing, "<span class='notice'>The wisp enhances your vision.</span>")
|
||||
|
||||
/obj/effect/wisp/stop_orbit(datum/component/orbiter/orbits)
|
||||
. = ..()
|
||||
if(ismob(orbits.parent))
|
||||
UnregisterSignal(orbits.parent, COMSIG_MOB_UPDATE_SIGHT)
|
||||
to_chat(orbits.parent, "<span class='notice'>Your vision returns to normal.</span>")
|
||||
|
||||
/obj/effect/wisp/proc/update_user_sight(mob/user)
|
||||
user.sight |= sight_flags
|
||||
if(!isnull(lighting_alpha))
|
||||
user.lighting_alpha = min(user.lighting_alpha, lighting_alpha)
|
||||
|
||||
//Red/Blue Cubes
|
||||
/obj/item/warp_cube
|
||||
name = "blue cube"
|
||||
@@ -781,19 +789,17 @@
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/contents = T.GetAllContents()
|
||||
var/mob/dead/observer/current_spirits = list()
|
||||
var/list/orbiters = list()
|
||||
for(var/thing in contents)
|
||||
var/atom/A = thing
|
||||
if (A.orbiters)
|
||||
orbiters += A.orbiters
|
||||
A.transfer_observers_to(src)
|
||||
|
||||
for(var/thing in orbiters)
|
||||
var/datum/orbit/O = thing
|
||||
if (isobserver(O.orbiter))
|
||||
var/mob/dead/observer/G = O.orbiter
|
||||
ghost_counter++
|
||||
G.invisibility = 0
|
||||
current_spirits |= G
|
||||
for(var/i in orbiters?.orbiters)
|
||||
if(!isobserver(i))
|
||||
continue
|
||||
var/mob/dead/observer/G = i
|
||||
ghost_counter++
|
||||
G.invisibility = 0
|
||||
current_spirits |= G
|
||||
|
||||
for(var/mob/dead/observer/G in spirits - current_spirits)
|
||||
G.invisibility = GLOB.observer_default_invisibility
|
||||
|
||||
@@ -26,7 +26,9 @@
|
||||
return
|
||||
|
||||
/mob/camera/forceMove(atom/destination)
|
||||
var/oldloc = loc
|
||||
loc = destination
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
|
||||
/mob/camera/emote(act, m_type=1, message = null, intentional = FALSE)
|
||||
return
|
||||
|
||||
@@ -34,7 +34,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
var/turf/new_turf = get_turf(destination)
|
||||
if (old_turf?.z != new_turf?.z)
|
||||
onTransitZ(old_turf?.z, new_turf?.z)
|
||||
var/oldloc = loc
|
||||
loc = destination
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
|
||||
/mob/dead/Stat()
|
||||
..()
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
return
|
||||
|
||||
var/obj/effect/mob_spawn/MS = pick(GLOB.mob_spawners[href_list["JoinAsGhostRole"]])
|
||||
if(istype(MS) && MS.attack_ghost(src, latejoinercalling = TRUE))
|
||||
if(MS?.attack_ghost(src, latejoinercalling = TRUE))
|
||||
SSticker.queued_players -= src
|
||||
SSticker.queue_delay = 4
|
||||
qdel(src)
|
||||
@@ -444,6 +444,9 @@
|
||||
if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE)
|
||||
available_job_count++
|
||||
for(var/spawner in GLOB.mob_spawners)
|
||||
var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner])
|
||||
if(!istype(S) || !S.can_latejoin())
|
||||
continue
|
||||
available_job_count++
|
||||
break
|
||||
|
||||
@@ -465,7 +468,10 @@
|
||||
"Security" = list(jobs = list(), titles = GLOB.security_positions, color = "#ff9999"),
|
||||
)
|
||||
for(var/spawner in GLOB.mob_spawners)
|
||||
categorizedJobs["Ghost Role"]["jobs"] += spawner
|
||||
var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner])
|
||||
if(!istype(S) || !S.can_latejoin())
|
||||
continue
|
||||
categorizedJobs["Ghost Role"]["jobs"] += S
|
||||
|
||||
for(var/datum/job/job in SSjob.occupations)
|
||||
if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE)
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
|
||||
// please make sure they're sorted alphabetically and categorized
|
||||
|
||||
/datum/sprite_accessory/socks/bee_knee
|
||||
name = "Knee-high (Bee)"
|
||||
icon_state = "bee_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/black_knee
|
||||
name = "Knee-high (Black)"
|
||||
icon_state = "black_knee"
|
||||
@@ -63,6 +67,42 @@
|
||||
name = "Short (White)"
|
||||
icon_state = "white_short"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_blue
|
||||
name = "Stockings (Blue)"
|
||||
icon_state = "stockings_blue"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_cyan
|
||||
name = "Stockings (Cyan)"
|
||||
icon_state = "stockings_cyan"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_dpink
|
||||
name = "Stockings (Dark Pink)"
|
||||
icon_state = "stockings_dpink"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_green
|
||||
name = "Stockings (Green)"
|
||||
icon_state = "stockings_black"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_orange
|
||||
name = "Stockings (Orange)"
|
||||
icon_state = "stockings_orange"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_programmer
|
||||
name = "Stockings (Programmer)"
|
||||
icon_state = "stockings_lpink"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_purple
|
||||
name = "Stockings (Purple)"
|
||||
icon_state = "stockings_purple"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_yellow
|
||||
name = "Stockings (Yellow)"
|
||||
icon_state = "stockings_yellow"
|
||||
|
||||
/datum/sprite_accessory/socks/bee_thigh
|
||||
name = "Thigh-high (Bee)"
|
||||
icon_state = "bee_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/black_thigh
|
||||
name = "Thigh-high (Black)"
|
||||
icon_state = "black_thigh"
|
||||
@@ -93,4 +133,4 @@
|
||||
|
||||
/datum/sprite_accessory/socks/white_thigh
|
||||
name = "Thigh-high (White)"
|
||||
icon_state = "white_thigh"
|
||||
icon_state = "white_thigh"
|
||||
|
||||
@@ -248,9 +248,13 @@
|
||||
icon_state = "bra_commie"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_babyblue
|
||||
name = "Bra, Baby Blue"
|
||||
name = "Bra - Baby Blue"
|
||||
icon_state = "bra_babyblue"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_beekini
|
||||
name = "Bra - Bee-kini"
|
||||
icon_state = "bra_bee-kini"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_black
|
||||
name = "Bra - Black"
|
||||
icon_state = "bra_black"
|
||||
|
||||
@@ -90,6 +90,9 @@
|
||||
name = "Boxer Briefs - Yellow"
|
||||
icon_state = "boxer_briefs_yellow"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_beekini
|
||||
name = "Panties - Bee-kini"
|
||||
icon_state = "panties_bee-kini"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_black
|
||||
name = "Panties - Black"
|
||||
|
||||
@@ -429,9 +429,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/orbitsize = (I.Width()+I.Height())*0.5
|
||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||
|
||||
if(orbiting && orbiting.orbiting != target)
|
||||
to_chat(src, "<span class='notice'>Now orbiting [target].</span>")
|
||||
|
||||
var/rot_seg
|
||||
|
||||
switch(ghost_orbit)
|
||||
@@ -450,10 +447,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
/mob/dead/observer/orbit()
|
||||
setDir(2)//reset dir so the right directional sprites show up
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/dead/observer/stop_orbit()
|
||||
..()
|
||||
/mob/dead/observer/stop_orbit(datum/component/orbiter/orbits)
|
||||
. = ..()
|
||||
//restart our floating animation after orbit is done.
|
||||
pixel_y = 0
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
@@ -753,7 +750,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
update_icon()
|
||||
|
||||
/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
return IsAdminGhost(usr)
|
||||
|
||||
/mob/dead/observer/is_literate()
|
||||
|
||||
@@ -265,7 +265,7 @@
|
||||
var/list/datum/brain_trauma/possible_traumas = list()
|
||||
for(var/T in subtypesof(brain_trauma_type))
|
||||
var/datum/brain_trauma/BT = T
|
||||
if(can_gain_trauma(BT, resilience))
|
||||
if(can_gain_trauma(BT, resilience) && initial(BT.random_gain))
|
||||
possible_traumas += BT
|
||||
|
||||
if(!LAZYLEN(possible_traumas))
|
||||
|
||||
@@ -496,9 +496,12 @@
|
||||
add_splatter_floor(T)
|
||||
if(stun)
|
||||
adjustBruteLoss(3)
|
||||
else if(src.reagents.has_reagent("blazaam"))
|
||||
if(T)
|
||||
T.add_vomit_floor(src, VOMIT_PURPLE)
|
||||
else
|
||||
if(T)
|
||||
T.add_vomit_floor(src, toxic)//toxic barf looks different
|
||||
T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different
|
||||
T = get_step(T, dir)
|
||||
if (is_blocked_turf(T))
|
||||
break
|
||||
@@ -895,6 +898,11 @@
|
||||
var/obj/item/organ/I = X
|
||||
I.Insert(src)
|
||||
|
||||
/mob/living/carbon/proc/update_disabled_bodyparts()
|
||||
for(var/B in bodyparts)
|
||||
var/obj/item/bodypart/BP = B
|
||||
BP.update_disabled()
|
||||
|
||||
/mob/living/carbon/vv_get_dropdown()
|
||||
. = ..()
|
||||
. += "---"
|
||||
|
||||
@@ -48,18 +48,27 @@
|
||||
if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
|
||||
affecting.dismember(P.damtype)
|
||||
|
||||
/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check)
|
||||
. = FALSE
|
||||
if(!skip_throw_mode_check && !in_throw_mode)
|
||||
return
|
||||
if(get_active_held_item())
|
||||
return
|
||||
if(restrained())
|
||||
return
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE)
|
||||
if(!skipcatch) //ugly, but easy
|
||||
if(in_throw_mode && !get_active_held_item()) //empty active hand and we're in throw mode
|
||||
if(canmove && !restrained())
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
if(isturf(I.loc))
|
||||
I.attack_hand(src)
|
||||
if(get_active_held_item() == I) //if our attack_hand() picks up the item...
|
||||
visible_message("<span class='warning'>[src] catches [I]!</span>") //catch that sucker!
|
||||
throw_mode_off()
|
||||
return 1
|
||||
if(can_catch_item())
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
if(isturf(I.loc))
|
||||
I.attack_hand(src)
|
||||
if(get_active_held_item() == I) //if our attack_hand() picks up the item...
|
||||
visible_message("<span class='warning'>[src] catches [I]!</span>") //catch that sucker!
|
||||
throw_mode_off()
|
||||
return 1
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -294,7 +294,7 @@
|
||||
if(mood.sanity <= SANITY_DISTURBED)
|
||||
msg += "[t_He] seem[p_s()] distressed.\n"
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src)
|
||||
if(mood.mood >= 5) //So roundstart people aren't all "happy"
|
||||
if(mood.shown_mood >= 6) //So roundstart people aren't all "happy" and that antags don't show their true happiness.
|
||||
msg += "[t_He] seem[p_s()] to have had something nice happen to them recently.\n"
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empathH", /datum/mood_event/happy_empath, src)
|
||||
if (HAS_TRAIT(src, TRAIT_BLIND))
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
/mob/living/carbon/human/Initialize()
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
verbs += /mob/living/proc/lay_down
|
||||
verbs += /mob/living/carbon/human/proc/underwear_toggle //fwee
|
||||
|
||||
//initialize limbs first
|
||||
create_bodyparts()
|
||||
@@ -724,12 +725,12 @@
|
||||
remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000")
|
||||
cut_overlay(MA)
|
||||
|
||||
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated() || lying )
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
if(!Adjacent(M) && (M.loc != src))
|
||||
if((be_close == 0) || (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))
|
||||
if((be_close == 0) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M))))
|
||||
return TRUE
|
||||
to_chat(src, "<span class='warning'>You are too far away!</span>")
|
||||
return FALSE
|
||||
@@ -851,19 +852,24 @@
|
||||
|
||||
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
|
||||
//If they dragged themselves and we're currently aggressively grabbing them try to piggyback
|
||||
if(user == target && can_piggyback(target) && pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS)
|
||||
if(user == target && can_piggyback(target) && pulling == target && (HAS_TRAIT(src, TRAIT_PACIFISM) || grab_state >= GRAB_AGGRESSIVE) && stat == CONSCIOUS)
|
||||
buckle_mob(target,TRUE,TRUE)
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/proc/piggyback_instant(mob/living/M)
|
||||
return buckle_mob(M, TRUE, TRUE, FALSE, TRUE)
|
||||
|
||||
//Can C try to piggyback at all.
|
||||
/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/C)
|
||||
if(istype(C) && C.stat == CONSCIOUS)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, bypass_piggybacking = FALSE, no_delay = FALSE)
|
||||
if(!force)//humans are only meant to be ridden through piggybacking and special cases
|
||||
return
|
||||
if(bypass_piggybacking)
|
||||
return ..()
|
||||
if(!is_type_in_typecache(M, can_ride_typecache))
|
||||
M.visible_message("<span class='warning'>[M] really can't seem to mount [src]...</span>")
|
||||
return
|
||||
@@ -876,7 +882,7 @@
|
||||
if(can_piggyback(M))
|
||||
riding_datum.ride_check_ridden_incapacitated = TRUE
|
||||
visible_message("<span class='notice'>[M] starts to climb onto [src]...</span>")
|
||||
if(do_after(M, 15, target = src))
|
||||
if(no_delay || do_after(M, 15, target = src))
|
||||
if(can_piggyback(M))
|
||||
if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
|
||||
M.visible_message("<span class='warning'>[M] can't hang onto [src]!</span>")
|
||||
|
||||
@@ -54,7 +54,12 @@
|
||||
else
|
||||
visible_message("<span class='danger'>[src] deflects the projectile!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
|
||||
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
|
||||
return 0
|
||||
if(!mind.martial_art.reroute_deflection)
|
||||
return FALSE
|
||||
else
|
||||
P.firer = src
|
||||
P.setAngle(rand(0, 360))//SHING
|
||||
return FALSE
|
||||
|
||||
if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself
|
||||
if(P.is_reflectable)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
|
||||
var/lip_color = "white"
|
||||
|
||||
var/age = 30 //Player's age (pure fluff)
|
||||
var/age = 30 //Player's age
|
||||
|
||||
var/underwear = "Nude" //Which underwear the player wants
|
||||
var/undershirt = "Nude" //Which undershirt the player wants
|
||||
|
||||
@@ -44,6 +44,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/siemens_coeff = 1 //base electrocution coefficient
|
||||
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
|
||||
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
|
||||
var/list/special_step_sounds //Sounds to override barefeet walkng
|
||||
var/grab_sound //Special sound for grabbing
|
||||
|
||||
// species-only traits. Can be found in DNA.dm
|
||||
var/list/species_traits = list()
|
||||
@@ -490,11 +492,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
//Underwear, Undershirts & Socks
|
||||
if(!(NO_UNDERWEAR in species_traits))
|
||||
if(H.underwear)
|
||||
if(H.hidden_underwear)
|
||||
H.underwear = "Nude"
|
||||
else
|
||||
H.underwear = H.saved_underwear
|
||||
var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear]
|
||||
if(underwear)
|
||||
standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER)
|
||||
|
||||
if(H.undershirt)
|
||||
if(H.hidden_undershirt)
|
||||
H.undershirt = "Nude"
|
||||
else
|
||||
H.undershirt = H.saved_undershirt
|
||||
var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt]
|
||||
if(undershirt)
|
||||
if(H.dna.species.sexes && H.gender == FEMALE)
|
||||
@@ -502,10 +512,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
else
|
||||
standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
|
||||
|
||||
if(H.socks && H.get_num_legs(FALSE) >= 2 && !(DIGITIGRADE in species_traits))
|
||||
if(H.socks && H.get_num_legs(FALSE) >= 2)
|
||||
if(H.hidden_socks)
|
||||
H.socks = "Nude"
|
||||
else
|
||||
H.socks = H.saved_socks
|
||||
var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
|
||||
if(socks)
|
||||
standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
|
||||
if(DIGITIGRADE in species_traits)
|
||||
standing += mutable_appearance(socks.icon, socks.icon_state + "_d", -BODY_LAYER)
|
||||
else
|
||||
standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
|
||||
|
||||
if(standing.len)
|
||||
H.overlays_standing[BODY_LAYER] = standing
|
||||
@@ -1285,7 +1302,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
. += H.physiology.speed_mod
|
||||
|
||||
if (H.m_intent == MOVE_INTENT_WALK && HAS_TRAIT(H, TRAIT_SPEEDY_STEP))
|
||||
. -= 1
|
||||
. -= 1.5
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN))
|
||||
ignoreslow = 1
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
var/list/special_names = list("Tarkus")
|
||||
var/human_surname_chance = 3
|
||||
var/special_name_chance = 5
|
||||
var/owner //dobby is a free golem
|
||||
|
||||
/datum/species/golem/random_name(gender,unique,lastname)
|
||||
var/golem_surname = pick(GLOB.golem_names)
|
||||
@@ -807,3 +808,196 @@
|
||||
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
C.ventcrawler = initial(C.ventcrawler)
|
||||
|
||||
/datum/species/golem/bronze
|
||||
name = "Bronze Golem"
|
||||
id = "bronze golem"
|
||||
prefix = "Bronze"
|
||||
special_names = list("Bell")
|
||||
fixed_mut_color = "cd7f32"
|
||||
info_text = "As a <span class='danger'>Bronze Golem</span>, you are very resistant to loud noises, and make loud noises if something hard hits you, however this ability does hurt your hearing."
|
||||
special_step_sounds = list('sound/machines/clockcult/integration_cog_install.ogg', 'sound/magic/clockwork/fellowship_armory.ogg' )
|
||||
attack_verb = "bonk"
|
||||
mutantears = /obj/item/organ/ears/bronze
|
||||
var/last_gong_time = 0
|
||||
var/gong_cooldown = 150
|
||||
|
||||
/datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
if(!(world.time > last_gong_time + gong_cooldown))
|
||||
return ..()
|
||||
if(P.flag == "bullet" || P.flag == "bomb")
|
||||
gong(H)
|
||||
return ..()
|
||||
|
||||
/datum/species/golem/bronze/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown && M.a_intent != INTENT_HELP)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/proc/gong(mob/living/carbon/human/H)
|
||||
last_gong_time = world.time
|
||||
for(var/mob/living/M in get_hearers_in_view(7,H))
|
||||
if(M.stat == DEAD) //F
|
||||
return
|
||||
if(M == H)
|
||||
H.show_message("<span class='narsiesmall'>You cringe with pain as your body rings around you!</span>", 2)
|
||||
H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
|
||||
H.soundbang_act(2, 0, 100, 1)
|
||||
H.jitteriness += 7
|
||||
var/distance = max(0,get_dist(get_turf(H),get_turf(M)))
|
||||
switch(distance)
|
||||
if(0 to 1)
|
||||
M.show_message("<span class='narsiesmall'>GONG!</span>", 2)
|
||||
M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
|
||||
M.soundbang_act(1, 0, 30, 3)
|
||||
M.confused += 10
|
||||
M.jitteriness += 4
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
|
||||
if(2 to 3)
|
||||
M.show_message("<span class='cult'>GONG!</span>", 2)
|
||||
M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE)
|
||||
M.soundbang_act(1, 0, 15, 2)
|
||||
M.jitteriness += 3
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
|
||||
else
|
||||
M.show_message("<span class='warning'>GONG!</span>", 2)
|
||||
M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE)
|
||||
|
||||
|
||||
/datum/species/golem/cardboard //Faster but weaker, can also make new shells on its own
|
||||
name = "Cardboard Golem"
|
||||
id = "cardboard golem"
|
||||
prefix = "Cardboard"
|
||||
special_names = list("Box")
|
||||
info_text = "As a <span class='danger'>Cardboard Golem</span>, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself."
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
fixed_mut_color = "ffffff"
|
||||
limbs_id = "c_golem" //special sprites
|
||||
attack_verb = "bash"
|
||||
armor = 25
|
||||
burnmod = 1.25
|
||||
heatmod = 2
|
||||
speedmod = 1.5
|
||||
punchdamagelow = 4
|
||||
punchstunthreshold = 7
|
||||
punchdamagehigh = 8
|
||||
var/last_creation = 0
|
||||
var/brother_creation_cooldown = 300
|
||||
|
||||
/datum/species/golem/cardboard/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(user != H)
|
||||
return FALSE //forced reproduction is rape.
|
||||
if(istype(I, /obj/item/stack/sheet/cardboard))
|
||||
var/obj/item/stack/sheet/cardboard/C = I
|
||||
if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork
|
||||
return
|
||||
if(C.amount < 10)
|
||||
to_chat(H, "<span class='warning'>You do not have enough cardboard!</span>")
|
||||
return FALSE
|
||||
to_chat(H, "<span class='notice'>You attempt to create a new cardboard brother.</span>")
|
||||
if(do_after(user, 30, target = user))
|
||||
if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork
|
||||
return
|
||||
if(!C.use(10))
|
||||
to_chat(H, "<span class='warning'>You do not have enough cardboard!</span>")
|
||||
return FALSE
|
||||
to_chat(H, "<span class='notice'>You create a new cardboard golem shell.</span>")
|
||||
create_brother(H.loc)
|
||||
|
||||
/datum/species/golem/cardboard/proc/create_brother(var/location)
|
||||
new /obj/effect/mob_spawn/human/golem/servant(location, /datum/species/golem/cardboard, owner)
|
||||
last_creation = world.time
|
||||
|
||||
/datum/species/golem/leather
|
||||
name = "Leather Golem"
|
||||
id = "leather golem"
|
||||
special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
|
||||
prefix = "Leather"
|
||||
fixed_mut_color = "624a2e"
|
||||
info_text = "As a <span class='danger'>Leather Golem</span>, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
|
||||
attack_verb = "whipp"
|
||||
grab_sound = 'sound/weapons/whipgrab.ogg'
|
||||
attack_sound = 'sound/weapons/whip.ogg'
|
||||
|
||||
/datum/species/golem/bone
|
||||
name = "Bone Golem"
|
||||
id = "bone golem"
|
||||
say_mod = "rattles"
|
||||
prefix = "Bone"
|
||||
limbs_id = "b_golem"
|
||||
special_names = list("Head", "Broth", "Fracture", "Rattler", "Appetit")
|
||||
liked_food = GROSS | MEAT | RAW
|
||||
toxic_food = null
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
sexes = FALSE
|
||||
fixed_mut_color = "ffffff"
|
||||
attack_verb = "rattl"
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER)
|
||||
info_text = "As a <span class='danger'>Bone Golem</span>, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
|
||||
var/datum/action/innate/bonechill/bonechill
|
||||
|
||||
/datum/species/golem/bone/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
if(ishuman(C))
|
||||
bonechill = new
|
||||
bonechill.Grant(C)
|
||||
|
||||
/datum/species/golem/bone/on_species_loss(mob/living/carbon/C)
|
||||
if(bonechill)
|
||||
bonechill.Remove(C)
|
||||
..()
|
||||
|
||||
/datum/action/innate/bonechill
|
||||
name = "Bone Chill"
|
||||
desc = "Rattle your bones and strike fear into your enemies!"
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
icon_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
button_icon_state = "bonechill"
|
||||
var/cooldown = 600
|
||||
var/last_use
|
||||
var/snas_chance = 3
|
||||
|
||||
/datum/action/innate/bonechill/Activate()
|
||||
if(world.time < last_use + cooldown)
|
||||
to_chat("<span class='notice'>You aren't ready yet to rattle your bones again</span>")
|
||||
return
|
||||
owner.visible_message("<span class='warning'>[owner] rattles [owner.p_their()] bones harrowingly.</span>", "<span class='notice'>You rattle your bones</span>")
|
||||
last_use = world.time
|
||||
if(prob(snas_chance))
|
||||
playsound(get_turf(owner),'sound/magic/RATTLEMEBONES2.ogg', 100)
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/mutable_appearance/badtime = mutable_appearance('icons/mob/human_parts.dmi', "b_golem_eyes", -FIRE_LAYER-0.5)
|
||||
badtime.appearance_flags = RESET_COLOR
|
||||
H.overlays_standing[FIRE_LAYER+0.5] = badtime
|
||||
H.apply_overlay(FIRE_LAYER+0.5)
|
||||
addtimer(CALLBACK(H, /mob/living/carbon/.proc/remove_overlay, FIRE_LAYER+0.5), 25)
|
||||
else
|
||||
playsound(get_turf(owner),'sound/magic/RATTLEMEBONES.ogg', 100)
|
||||
for(var/mob/living/L in orange(7, get_turf(owner)))
|
||||
if((MOB_UNDEAD in L.mob_biotypes) || isgolem(L) || HAS_TRAIT(L, TRAIT_RESISTCOLD))
|
||||
return //Do not affect our brothers
|
||||
|
||||
to_chat(L, "<span class='cultlarge'>A spine-chilling sound chills you to the bone!</span>")
|
||||
L.apply_status_effect(/datum/status_effect/bonechill)
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "spooked", /datum/mood_event/spooked)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
sexes = 0
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
|
||||
|
||||
@@ -73,6 +73,9 @@
|
||||
/datum/species/pod/pseudo_weak
|
||||
id = "podweak"
|
||||
limbs_id = "pod"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS)
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs")
|
||||
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
|
||||
light_nutrition_gain_factor = 7.5
|
||||
light_bruteheal = 0.2
|
||||
light_burnheal = 0.2
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
sexes = 0
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
|
||||
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
|
||||
@@ -21,4 +21,4 @@
|
||||
|
||||
/datum/species/skeleton/pirate
|
||||
name = "Space Queen's Skeleton"
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
|
||||
@@ -654,6 +654,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
L.damage += d
|
||||
|
||||
/mob/living/carbon/proc/liver_failure()
|
||||
reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs
|
||||
reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE)
|
||||
if(HAS_TRAIT(src, TRAIT_STABLEHEART))
|
||||
return
|
||||
|
||||
@@ -73,39 +73,21 @@
|
||||
if(I.loc == src)
|
||||
return TRUE
|
||||
|
||||
if(I.anchored)
|
||||
if(I.anchored || !put_in_hands(I))
|
||||
blacklistItems[I] ++
|
||||
return FALSE
|
||||
|
||||
// WEAPONS
|
||||
if(istype(I, /obj/item))
|
||||
var/obj/item/W = I
|
||||
if(W.force >= best_force)
|
||||
put_in_hands(W)
|
||||
best_force = W.force
|
||||
return TRUE
|
||||
|
||||
// CLOTHING
|
||||
else if(istype(I, /obj/item/clothing))
|
||||
var/obj/item/clothing/C = I
|
||||
monkeyDrop(C)
|
||||
addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5)
|
||||
return TRUE
|
||||
|
||||
// EVERYTHING ELSE
|
||||
if(I.force >= best_force)
|
||||
best_force = I.force
|
||||
else
|
||||
if(!get_item_for_held_index(1) || !get_item_for_held_index(2))
|
||||
put_in_hands(I)
|
||||
return TRUE
|
||||
addtimer(CALLBACK(src, .proc/pickup_and_wear, I), 5)
|
||||
|
||||
blacklistItems[I] ++
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/monkey/proc/pickup_and_wear(var/obj/item/clothing/C)
|
||||
if(!equip_to_appropriate_slot(C))
|
||||
monkeyDrop(get_item_by_slot(C)) // remove the existing item if worn
|
||||
sleep(5)
|
||||
equip_to_appropriate_slot(C)
|
||||
/mob/living/carbon/monkey/proc/pickup_and_wear(obj/item/I)
|
||||
if(QDELETED(I) || I.loc != src)
|
||||
return
|
||||
equip_to_appropriate_slot(I)
|
||||
|
||||
/mob/living/carbon/monkey/resist_restraints()
|
||||
var/obj/item/I = null
|
||||
@@ -311,7 +293,8 @@
|
||||
if(I == pickupTarget)
|
||||
M.visible_message("<span class='danger'>[src] snatches [pickupTarget] from [M].</span>", "<span class='userdanger'>[src] snatched [pickupTarget]!</span>")
|
||||
if(M.temporarilyRemoveItemFromInventory(pickupTarget) && !QDELETED(pickupTarget))
|
||||
equip_item(pickupTarget)
|
||||
if(!equip_item(pickupTarget))
|
||||
dropItemToGround(pickupTarget)
|
||||
else
|
||||
M.visible_message("<span class='danger'>[src] tried to snatch [pickupTarget] from [M], but failed!</span>", "<span class='userdanger'>[src] tried to grab [pickupTarget]!</span>")
|
||||
pickpocketing = FALSE
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
var/mob/M = AM
|
||||
|
||||
log_combat(src, M, "grabbed", addition="passive grab")
|
||||
if(!supress_message)
|
||||
if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER)))
|
||||
visible_message("<span class='warning'>[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!</span>") //Cit change - And they thought ERP was bad.
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
@@ -281,6 +281,11 @@
|
||||
var/datum/disease/D = thing
|
||||
if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
|
||||
ContactContractDisease(D)
|
||||
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER))
|
||||
C.grippedby(src)
|
||||
|
||||
//mob verbs are a lot faster than object verbs
|
||||
//for more info on why this is not atom/pull, see examinate() in mob.dm
|
||||
@@ -814,7 +819,7 @@
|
||||
/mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering
|
||||
return
|
||||
|
||||
/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
@@ -1189,9 +1194,13 @@
|
||||
clamp_unconscious_to = 0,
|
||||
clamp_immobility_to = 0,
|
||||
reset_misc = TRUE,
|
||||
healing_chems = list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10, "stimulants" = 10),
|
||||
message = "<span class='boldnotice'>You feel a surge of energy!</span>"
|
||||
healing_chems = list("inaprovaline" = 3, "synaptizine" = 10, "regen_jelly" = 10, "stimulants" = 10),
|
||||
message = "<span class='boldnotice'>You feel a surge of energy!</span>",
|
||||
stamina_buffer_boost = 0, //restores stamina buffer rather than just health
|
||||
scale_stamina_loss_recovery, //defaults to null. if this is set, restores loss * this stamina. make sure it's a fraction.
|
||||
stamina_loss_recovery_bypass = 0 //amount of stamina loss to ignore during calculation
|
||||
)
|
||||
to_chat(src, message)
|
||||
if(AmountSleeping() > clamp_unconscious_to)
|
||||
SetSleeping(clamp_unconscious_to)
|
||||
if(AmountUnconscious() > clamp_unconscious_to)
|
||||
@@ -1200,7 +1209,10 @@
|
||||
SetStun(clamp_immobility_to)
|
||||
if(AmountKnockdown() > clamp_immobility_to)
|
||||
SetKnockdown(clamp_immobility_to)
|
||||
adjustStaminaLoss(max(0, -stamina_boost))
|
||||
adjustStaminaLoss(min(0, -stamina_boost))
|
||||
adjustStaminaLossBuffered(min(0, -stamina_buffer_boost))
|
||||
if(scale_stamina_loss_recovery)
|
||||
adjustStaminaLoss(min(-((getStaminaLoss() - stamina_loss_recovery_bypass) * scale_stamina_loss_recovery), 0))
|
||||
if(put_on_feet)
|
||||
resting = FALSE
|
||||
lying = FALSE
|
||||
|
||||
@@ -288,8 +288,17 @@
|
||||
|
||||
/mob/living/silicon/ai/can_interact_with(atom/A)
|
||||
. = ..()
|
||||
var/turf/ai = get_turf(src)
|
||||
var/turf/target = get_turf(A)
|
||||
if (.)
|
||||
return
|
||||
|
||||
if(!target)
|
||||
return
|
||||
|
||||
if ((ai.z != target.z) && !is_station_level(ai.z))
|
||||
return FALSE
|
||||
|
||||
if (istype(loc, /obj/item/aicard))
|
||||
var/turf/T0 = get_turf(src)
|
||||
var/turf/T1 = get_turf(A)
|
||||
@@ -779,7 +788,7 @@
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(control_disabled || incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
|
||||
// See software.dm for Topic()
|
||||
|
||||
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(be_close && !in_range(M, src))
|
||||
to_chat(src, "<span class='warning'>You are too far away!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -910,7 +910,7 @@
|
||||
if(DISCONNECT) //Tampering with the wires
|
||||
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Remote telemetry lost with [name].</span><br>")
|
||||
|
||||
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(stat || lockcharge || low_power_mode)
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -284,12 +284,8 @@
|
||||
if(health < maxHealth)
|
||||
adjustBruteLoss(-8) //Fast life regen
|
||||
for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts!
|
||||
if(D.icon_state != "donut2")
|
||||
D.name = "frosted donut"
|
||||
D.icon_state = "donut2"
|
||||
D.reagents.add_reagent("sprinkles", 2)
|
||||
D.bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
|
||||
D.filling_color = "#FF69B4"
|
||||
if(!D.is_frosted)
|
||||
D.frost_donut()
|
||||
|
||||
/mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L)
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/mob/living/simple_animal/pet/redpanda
|
||||
name = "Red panda"
|
||||
desc = "Wah't a dork."
|
||||
icon = 'icons/mob/pets.dmi'
|
||||
icon_state = "red_panda"
|
||||
icon_living = "red_panda"
|
||||
icon_dead = "dead_panda"
|
||||
speak = list("Churip","Chuuriip","Cheep-cheep","Chiteurp","squueeaacipt")
|
||||
speak_emote = list("chirps", "huff-quacks")
|
||||
emote_hear = list("squeak-chrips.", "huff-squacks.")
|
||||
emote_see = list("shakes its head.", "rolls about.")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
do_footstep = TRUE
|
||||
@@ -596,6 +596,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
/obj/item/guardiancreator/tech/choose/traitor
|
||||
possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
|
||||
|
||||
/obj/item/guardiancreator/tech/choose/traitor/check_uplink_validity()
|
||||
return !used
|
||||
|
||||
/obj/item/guardiancreator/tech/choose
|
||||
random = FALSE
|
||||
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
if(vore_active)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made
|
||||
if(!client && L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made
|
||||
if(prob(voracious_chance))
|
||||
vore_attack(src,L,src)
|
||||
else
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
if(target)
|
||||
return new childspawn(target)
|
||||
|
||||
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -784,7 +784,7 @@
|
||||
return 0
|
||||
|
||||
//Can the mob use Topic to interact with machines
|
||||
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
return
|
||||
|
||||
/mob/proc/faction_check_mob(mob/target, exact_match)
|
||||
@@ -871,13 +871,7 @@
|
||||
return
|
||||
|
||||
/mob/proc/update_sight()
|
||||
for(var/O in orbiters)
|
||||
var/datum/orbit/orbit = O
|
||||
var/obj/effect/wisp/wisp = orbit.orbiter
|
||||
if (istype(wisp))
|
||||
sight |= wisp.sight_flags
|
||||
if(!isnull(wisp.lighting_alpha))
|
||||
lighting_alpha = min(lighting_alpha, wisp.lighting_alpha)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
|
||||
|
||||
sync_lighting_plane_alpha()
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
if(INCORPOREAL_MOVE_BASIC)
|
||||
var/T = get_step(L,direct)
|
||||
if(T)
|
||||
L.loc = T
|
||||
L.forceMove(T)
|
||||
L.setDir(direct)
|
||||
if(INCORPOREAL_MOVE_SHADOW)
|
||||
if(prob(50))
|
||||
@@ -190,7 +190,7 @@
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
|
||||
var/T = get_step(L,direct)
|
||||
if(T)
|
||||
L.loc = T
|
||||
L.forceMove(T)
|
||||
L.setDir(direct)
|
||||
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
var/turf/open/floor/stepTurf = get_step(L, direct)
|
||||
@@ -209,7 +209,7 @@
|
||||
to_chat(L, "<span class='warning'>Holy energies block your path!</span>")
|
||||
return
|
||||
|
||||
L.loc = get_step(L, direct)
|
||||
L.forceMove(stepTurf)
|
||||
L.setDir(direct)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
return machinery_computer.update_icon()
|
||||
|
||||
// This thing is not meant to be used on it's own, get topic data from our machinery owner.
|
||||
//obj/item/modular_computer/processor/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
//obj/item/modular_computer/processor/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
// if(!machinery_computer)
|
||||
// return 0
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
var/mindrain = 200
|
||||
var/maxdrain = 400
|
||||
|
||||
var/stunforce = 140 //Same as stunbaton, adjustable.
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
|
||||
if(!candrain || draining)
|
||||
|
||||
@@ -14,7 +14,7 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff.
|
||||
anchored = TRUE//Can't drag/grab the net.
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
max_integrity = 25 //How much health it has.
|
||||
max_integrity = 50 //How much health it has.
|
||||
can_buckle = 1
|
||||
buckle_lying = 0
|
||||
buckle_prevents_pull = TRUE
|
||||
@@ -59,6 +59,41 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
continue
|
||||
H.dropItemToGround(W)
|
||||
|
||||
var/datum/antagonist/antag_datum
|
||||
for(var/datum/antagonist/ninja/AD in GLOB.antagonists) //Because only ninjas get capture objectives; They're not doable without the suit.
|
||||
if(AD.owner == master)
|
||||
antag_datum = AD
|
||||
break
|
||||
|
||||
for(var/datum/objective/capture/capture in antag_datum)
|
||||
if(istype(affecting, /mob/living/carbon/human)) //Humans.
|
||||
if(affecting.stat == DEAD)//Dead folks are worth less.
|
||||
capture.captured_amount+=0.5
|
||||
continue
|
||||
capture.captured_amount+=1
|
||||
if(istype(affecting, /mob/living/carbon/monkey)) //Monkeys are almost worthless, you failure.
|
||||
capture.captured_amount+=0.1
|
||||
if(istype(affecting, /mob/living/carbon/alien/larva)) //Larva are important for research.
|
||||
if(affecting.stat == DEAD)
|
||||
capture.captured_amount+=0.5
|
||||
continue
|
||||
capture.captured_amount+=1
|
||||
if(istype(affecting, /mob/living/carbon/alien/humanoid)) //Aliens are worth twice as much as humans.
|
||||
if(istype(affecting, /mob/living/carbon/alien/humanoid/royal/queen)) //Queens are worth three times as much as humans.
|
||||
if(affecting.stat == DEAD)
|
||||
capture.captured_amount+=1.5
|
||||
else
|
||||
capture.captured_amount+=3
|
||||
continue
|
||||
if(affecting.stat == DEAD)
|
||||
capture.captured_amount+=1
|
||||
continue
|
||||
capture.captured_amount+=2
|
||||
|
||||
|
||||
affecting.revive(1, 1) //Basically a revive and full heal, including limbs/organs
|
||||
//In case people who have been captured dead want to hang out at the holding area
|
||||
|
||||
playsound(affecting, 'sound/effects/sparks4.ogg', 50, 1)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(affecting.drop_location(), affecting.dir)
|
||||
|
||||
@@ -73,8 +108,9 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
playsound(affecting, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase(affecting.drop_location(), affecting.dir)
|
||||
|
||||
/obj/structure/energy_net/attack_paw(mob/user)
|
||||
return attack_hand()
|
||||
/obj/attack_alien(mob/living/carbon/alien/humanoid/user)
|
||||
if(attack_generic(user, 15, BRUTE, "melee", 0)) //Aliens normally deal 60 damage to structures. They'd one-shot nets without this.
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
|
||||
/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/living/user)
|
||||
return//We only want our target to be buckled
|
||||
|
||||
@@ -2,21 +2,34 @@
|
||||
//Allows the ninja to kidnap people
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet()
|
||||
var/mob/living/carbon/human/H = affecting
|
||||
var/mob/living/carbon/C = input("Select who to capture:","Capture who?",null) as null|mob in oview(H)
|
||||
var/mob/living/carbon/C
|
||||
|
||||
//If there's only one valid target, let's actually try to capture it, rather than forcing
|
||||
//the user to fiddle with the dialog displaying a list of one
|
||||
//Also, let's make this smarter and not list mobs you can't currently net.
|
||||
var/Candidates[]
|
||||
for(var/mob/mob in oview(H))
|
||||
if(!mob.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
|
||||
//to_chat(H, "<span class='warning'>[C.p_they(TRUE)] will bring no honor to your Clan!</span>")
|
||||
continue
|
||||
if(locate(/obj/structure/energy_net) in get_turf(mob))//Check if they are already being affected by an energy net.
|
||||
//to_chat(H, "<span class='warning'>[C.p_they(TRUE)] are already trapped inside an energy net!</span>")
|
||||
continue
|
||||
for(var/turf/T in getline(get_turf(H), get_turf(mob)))
|
||||
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
|
||||
//to_chat(H, "<span class='warning'>You may not use an energy net through solid obstacles!</span>")
|
||||
continue
|
||||
Candidates+=mob
|
||||
|
||||
if(Candidates.len == 1)
|
||||
C = Candidates[1]
|
||||
else
|
||||
C = input("Select who to capture:","Capture who?",null) as null|mob in Candidates
|
||||
|
||||
|
||||
if(QDELETED(C)||!(C in oview(H)))
|
||||
return 0
|
||||
|
||||
if(!C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
|
||||
to_chat(H, "<span class='warning'>[C.p_they(TRUE)] will bring no honor to your Clan!</span>")
|
||||
return
|
||||
if(locate(/obj/structure/energy_net) in get_turf(C))//Check if they are already being affected by an energy net.
|
||||
to_chat(H, "<span class='warning'>[C.p_they(TRUE)] are already trapped inside an energy net!</span>")
|
||||
return
|
||||
for(var/turf/T in getline(get_turf(H), get_turf(C)))
|
||||
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
|
||||
to_chat(H, "<span class='warning'>You may not use an energy net through solid obstacles!</span>")
|
||||
return
|
||||
if(!ninjacost(200,N_STEALTH_CANCEL))
|
||||
H.Beam(C,"n_beam",time=15)
|
||||
H.say("Get over here!", forced = "ninja net")
|
||||
|
||||
@@ -261,4 +261,19 @@ They *could* go in their appropriate files, but this is supposed to be modular
|
||||
spark_system.set_up(5, 0, loc)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
visible_message("<span class='danger'>[H] electrocutes [src] with [H.p_their()] touch!</span>", "<span class='userdanger'>[H] electrocutes you with [H.p_their()] touch!</span>")
|
||||
electrocute_act(25, H)
|
||||
electrocute_act(15, H)
|
||||
|
||||
Knockdown(G.stunforce)
|
||||
adjustStaminaLoss(G.stunforce*0.1, affected_zone = (istype(H) ? H.zone_selected : BODY_ZONE_CHEST))
|
||||
apply_effect(EFFECT_STUTTER, G.stunforce)
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_MINOR_SHOCK)
|
||||
|
||||
lastattacker = H.real_name
|
||||
lastattackerckey = H.ckey
|
||||
log_combat(H, src, "stunned")
|
||||
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/Hsrc = src
|
||||
Hsrc.forcesay(GLOB.hit_appends)
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
/datum/orbit
|
||||
var/atom/movable/orbiter
|
||||
var/atom/orbiting
|
||||
var/lock = TRUE
|
||||
var/turf/lastloc
|
||||
var/lastprocess
|
||||
|
||||
/datum/orbit/New(_orbiter, _orbiting, _lock)
|
||||
orbiter = _orbiter
|
||||
orbiting = _orbiting
|
||||
SSorbit.processing += src
|
||||
if (!orbiting.orbiters)
|
||||
orbiting.orbiters = list()
|
||||
orbiting.orbiters += src
|
||||
|
||||
if (orbiter.orbiting)
|
||||
orbiter.stop_orbit()
|
||||
orbiter.orbiting = src
|
||||
Check()
|
||||
lock = _lock
|
||||
|
||||
//do not qdel directly, use stop_orbit on the orbiter. (This way the orbiter can bind to the orbit stopping)
|
||||
/datum/orbit/Destroy(force = FALSE)
|
||||
SSorbit.processing -= src
|
||||
if (orbiter)
|
||||
orbiter.orbiting = null
|
||||
orbiter = null
|
||||
if (orbiting)
|
||||
if (orbiting.orbiters)
|
||||
orbiting.orbiters -= src
|
||||
if (!orbiting.orbiters.len)//we are the last orbit, delete the list
|
||||
orbiting.orbiters = null
|
||||
orbiting = null
|
||||
return ..()
|
||||
|
||||
/datum/orbit/proc/Check(turf/targetloc, list/checked_already = list())
|
||||
//Avoid infinite loops for people who end up orbiting themself through another orbiter
|
||||
checked_already[src] = TRUE
|
||||
if (!orbiter)
|
||||
qdel(src)
|
||||
return
|
||||
if (!orbiting)
|
||||
orbiter.stop_orbit()
|
||||
return
|
||||
if (!orbiter.orbiting) //admin wants to stop the orbit.
|
||||
orbiter.orbiting = src //set it back to us first
|
||||
orbiter.stop_orbit()
|
||||
var/atom/movable/AM = orbiting
|
||||
if(istype(AM) && AM.orbiting && AM.orbiting.orbiting == orbiter)
|
||||
orbiter.stop_orbit()
|
||||
return
|
||||
lastprocess = world.time
|
||||
if (!targetloc)
|
||||
targetloc = get_turf(orbiting)
|
||||
if (!targetloc || (!lock && orbiter.loc != lastloc && orbiter.loc != targetloc))
|
||||
orbiter.stop_orbit()
|
||||
return
|
||||
var/turf/old_turf = get_turf(orbiter)
|
||||
var/turf/new_turf = get_turf(targetloc)
|
||||
if (old_turf?.z != new_turf?.z)
|
||||
orbiter.onTransitZ(old_turf?.z, new_turf?.z)
|
||||
// DO NOT PORT TO FORCEMOVE - MEMECODE WILL KILL MC
|
||||
orbiter.loc = targetloc
|
||||
orbiter.update_parallax_contents()
|
||||
orbiter.update_light()
|
||||
lastloc = orbiter.loc
|
||||
for(var/other_orbit in orbiter.orbiters)
|
||||
var/datum/orbit/OO = other_orbit
|
||||
//Skip if checked already
|
||||
if(checked_already[OO])
|
||||
continue
|
||||
OO.Check(targetloc, checked_already)
|
||||
|
||||
/atom/movable/var/datum/orbit/orbiting = null
|
||||
/atom/var/list/orbiters = null
|
||||
|
||||
//A: atom to orbit
|
||||
//radius: range to orbit at, radius of the circle formed by orbiting (in pixels)
|
||||
//clockwise: whether you orbit clockwise or anti clockwise
|
||||
//rotation_speed: how fast to rotate (how many ds should it take for a rotation to complete)
|
||||
//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default.
|
||||
//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts
|
||||
//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts)
|
||||
|
||||
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE)
|
||||
if (!istype(A))
|
||||
return
|
||||
|
||||
new/datum/orbit(src, A, lockinorbit)
|
||||
if (!orbiting) //something failed, and our orbit datum deleted itself
|
||||
return
|
||||
var/matrix/initial_transform = matrix(transform)
|
||||
|
||||
//Head first!
|
||||
if (pre_rotation)
|
||||
var/matrix/M = matrix(transform)
|
||||
var/pre_rot = 90
|
||||
if(!clockwise)
|
||||
pre_rot = -90
|
||||
M.Turn(pre_rot)
|
||||
transform = M
|
||||
|
||||
var/matrix/shift = matrix(transform)
|
||||
shift.Translate(0,radius)
|
||||
transform = shift
|
||||
|
||||
SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
|
||||
|
||||
//we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit
|
||||
transform = initial_transform
|
||||
|
||||
/atom/movable/proc/stop_orbit()
|
||||
SpinAnimation(0,0)
|
||||
qdel(orbiting)
|
||||
|
||||
/atom/Destroy(force = FALSE)
|
||||
. = ..()
|
||||
if (orbiters)
|
||||
for (var/thing in orbiters)
|
||||
var/datum/orbit/O = thing
|
||||
if (O.orbiter)
|
||||
O.orbiter.stop_orbit()
|
||||
|
||||
/atom/movable/Destroy(force = FALSE)
|
||||
. = ..()
|
||||
if (orbiting)
|
||||
stop_orbit()
|
||||
|
||||
/atom/movable/proc/transfer_observers_to(atom/movable/target)
|
||||
if(orbiters)
|
||||
for(var/thing in orbiters)
|
||||
var/datum/orbit/O = thing
|
||||
if(O.orbiter && isobserver(O.orbiter))
|
||||
var/mob/dead/observer/D = O.orbiter
|
||||
D.ManualFollow(target)
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/obj/item/paperplane
|
||||
name = "paper plane"
|
||||
desc = "Paper, folded in the shape of a plane."
|
||||
@@ -10,8 +11,14 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 50
|
||||
|
||||
var/hit_probability = 2//%
|
||||
var/obj/item/paper/internalPaper
|
||||
|
||||
/obj/item/paperplane/origami
|
||||
desc = "Paper, masterfully folded in the shape of a plane."
|
||||
throwforce = 20 //same as throwing stars, but no chance of embedding.
|
||||
hit_probability = 100 //guaranteed to cause eye damage when it hits a mob.
|
||||
|
||||
/obj/item/paperplane/Initialize(mapload, obj/item/paper/newPaper)
|
||||
. = ..()
|
||||
pixel_y = rand(-8, 8)
|
||||
@@ -22,13 +29,18 @@
|
||||
color = newPaper.color
|
||||
newPaper.forceMove(src)
|
||||
else
|
||||
internalPaper = new /obj/item/paper(src)
|
||||
internalPaper = new(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/paperplane/Destroy()
|
||||
if(internalPaper)
|
||||
qdel(internalPaper)
|
||||
/obj/item/paperplane/handle_atom_del(atom/A)
|
||||
if(A == internalPaper)
|
||||
internalPaper = null
|
||||
if(!QDELETED(src))
|
||||
qdel(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/paperplane/Destroy()
|
||||
QDEL_NULL(internalPaper)
|
||||
return ..()
|
||||
|
||||
/obj/item/paperplane/suicide_act(mob/living/user)
|
||||
@@ -48,7 +60,7 @@
|
||||
|
||||
/obj/item/paperplane/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You unfold [src].</span>")
|
||||
var/atom/movable/internal_paper_tmp = internalPaper
|
||||
var/obj/item/paper/internal_paper_tmp = internalPaper
|
||||
internal_paper_tmp.forceMove(loc)
|
||||
internalPaper = null
|
||||
qdel(src)
|
||||
@@ -86,11 +98,18 @@
|
||||
. = ..(target, range, speed, thrower, FALSE, diagonals_first, callback)
|
||||
|
||||
/obj/item/paperplane/throw_impact(atom/hit_atom)
|
||||
if(iscarbon(hit_atom))
|
||||
var/mob/living/carbon/C = hit_atom
|
||||
if(C.can_catch_item(TRUE))
|
||||
var/datum/action/innate/origami/origami_action = locate() in C.actions
|
||||
if(origami_action?.active) //if they're a master of origami and have the ability turned on, force throwmode on so they'll automatically catch the plane.
|
||||
C.throw_mode_on()
|
||||
|
||||
if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman
|
||||
return
|
||||
var/mob/living/carbon/human/H = hit_atom
|
||||
if(prob(2))
|
||||
if((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES))
|
||||
if(prob(hit_probability))
|
||||
if(H.is_eyes_covered())
|
||||
return
|
||||
visible_message("<span class='danger'>\The [src] hits [H] in the eye!</span>")
|
||||
H.adjust_blurriness(6)
|
||||
@@ -103,9 +122,15 @@
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to fold it into a paper plane.</span>")
|
||||
|
||||
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You fold [src] into the shape of a plane!</span>")
|
||||
user.temporarilyRemoveItemFromInventory(src)
|
||||
I = new /obj/item/paperplane(user, src)
|
||||
var/obj/item/paperplane/plane_type = /obj/item/paperplane
|
||||
//Origami Master
|
||||
var/datum/action/innate/origami/origami_action = locate() in user.actions
|
||||
if(origami_action?.active)
|
||||
plane_type = /obj/item/paperplane/origami
|
||||
|
||||
I = new plane_type(user, src)
|
||||
user.put_in_hands(I)
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
|
||||
/obj/item/stock_parts/cell/Initialize(mapload, override_maxcharge)
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
if(self_recharge)
|
||||
START_PROCESSING(SSobj, src)
|
||||
create_reagents(5, INJECTABLE | DRAINABLE)
|
||||
if (override_maxcharge)
|
||||
maxcharge = override_maxcharge
|
||||
@@ -69,8 +70,8 @@
|
||||
return 100*charge/maxcharge
|
||||
|
||||
// use power from a cell
|
||||
/obj/item/stock_parts/cell/use(amount)
|
||||
if(rigged && amount > 0)
|
||||
/obj/item/stock_parts/cell/use(amount, can_explode = TRUE)
|
||||
if(rigged && amount > 0 && can_explode)
|
||||
explode()
|
||||
return 0
|
||||
if(charge < amount)
|
||||
@@ -103,9 +104,8 @@
|
||||
return (FIRELOSS)
|
||||
|
||||
/obj/item/stock_parts/cell/on_reagent_change(changetype)
|
||||
rigged = !isnull(reagents.has_reagent("plasma", 5)) //has_reagent returns the reagent datum
|
||||
..()
|
||||
|
||||
rigged = reagents?.has_reagent("plasma", 5) ? TRUE : FALSE //has_reagent returns the reagent datum
|
||||
|
||||
/obj/item/stock_parts/cell/proc/explode()
|
||||
var/turf/T = get_turf(src.loc)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user