This commit is contained in:
FalseIncarnate
2016-09-06 05:28:43 -04:00
189 changed files with 1934 additions and 1560 deletions
+3 -3
View File
@@ -99,10 +99,10 @@
if(last_editor)
output += "<br><span class='memoedit'>Last edit by [last_editor] <A href='?_src_=holder;memoeditlist=[ckey]'>(Click here to see edit log)</A></span>"
output += "<br>[memotext]</span><br>"
if(!output && !silent)
if(output)
to_chat(src, output)
else if(!silent)
to_chat(src, "No memos found in database.")
return
to_chat(src, output)
if("Remove")
var/DBQuery/query_memodellist = dbcon.NewQuery("SELECT ckey FROM [format_table_name("memo")]")
if(!query_memodellist.Execute())
+3 -3
View File
@@ -77,7 +77,7 @@ DEBUG
if(jobban_regex.Find(s))
jobban_assoc_insert(jobban_regex.group[1], jobban_regex.group[2], jobban_regex.group[3])
else
log_debug("Skipping malformed job ban: [s]")
log_runtime(EXCEPTION("Skipping malformed job ban: [s]"))
else
if(!establish_db_connection())
log_to_dd("Database connection failed. Reverting to the legacy ban system.")
@@ -132,9 +132,9 @@ DEBUG
if(jobban_assoclist[ckey] && jobban_assoclist[ckey][rank])
jobban_assoclist[ckey] -= rank
else
log_debug("Attempted to remove non-existent job ban: [X]")
log_runtime(EXCEPTION("Attempted to remove non-existent job ban: [X]"))
else
log_debug("Failed to remove malformed job ban from associative list: [X]")
log_runtime(EXCEPTION("Failed to remove malformed job ban from associative list: [X]"))
jobban_keylist.Remove(jobban_keylist[i])
if(config.ban_legacy_system)
jobban_savebanfile()
+1 -1
View File
@@ -86,7 +86,7 @@
cl = c
cl.images += I
else
log_debug("Buildmode reticule created without a client!")
log_runtime(EXCEPTION("Buildmode reticule created without a client!"), src)
/obj/effect/buildmode_reticule/proc/deselect()
qdel(src)
+1
View File
@@ -652,6 +652,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("strip")
//do nothing
// god is dead
if("as job...")
if(jobdatum)
dresscode = "[jobdatum.title]"
+39 -19
View File
@@ -1,7 +1,7 @@
/client/proc/air_status(turf/target as turf)
set category = "Debug"
set name = "Display Air Status"
if(!check_rights(R_DEBUG))
return
@@ -18,22 +18,22 @@
to_chat(usr, "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]")
for(var/datum/gas/trace_gas in GM.trace_gases)
to_chat(usr, "[trace_gas.type]: [trace_gas.moles]")
message_admins("[key_name_admin(usr)] has checked the air status of [T]")
log_admin("[key_name(usr)] has checked the air status of [T]")
log_admin("[key_name(usr)] has checked the air status of [T]")
feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/fix_next_move()
set category = "Debug"
set name = "Unfreeze Everyone"
if(!check_rights(R_DEBUG))
return
return
message_admins("[key_name_admin(usr)] has unfrozen everyone")
log_admin("[key_name(usr)] has unfrozen everyone")
var/largest_move_time = 0
var/largest_click_time = 0
var/mob/largest_move_mob = null
@@ -56,18 +56,18 @@
log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] next_click = [M.next_click] world.time = [world.time]")
M.next_move = 1
M.next_click = 0
message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!", 1)
message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1)
message_admins("world.time = [world.time]", 1)
feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/radio_report()
set category = "Debug"
set name = "Radio report"
if(!check_rights(R_DEBUG))
return
@@ -102,9 +102,9 @@
output += "&nbsp;&nbsp;&nbsp;&nbsp;[device]<br>"
usr << browse(output,"window=radioreport")
message_admins("[key_name_admin(usr)] has generated a radio report")
log_admin("[key_name(usr)] has generated a radio report")
log_admin("[key_name(usr)] has generated a radio report")
feedback_add_details("admin_verb","RR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -112,12 +112,12 @@
set name = "Reload Admins"
set category = "Debug"
if(!check_rights(R_SERVER))
if(!check_rights(R_SERVER))
return
message_admins("[key_name_admin(usr)] has manually reloaded admins")
log_admin("[key_name(usr)] has manually reloaded admins")
load_admins()
feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -126,14 +126,14 @@
set name = "Print Jobban Log"
set desc = "This spams all the active jobban entries for the current round to standard output."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
to_chat(usr, "<b>Jobbans active in this round.</b>")
for(var/t in jobban_keylist)
to_chat(usr, "[t]")
message_admins("[key_name_admin(usr)] has printed the jobban log")
log_admin("[key_name(usr)] has printed the jobban log")
@@ -141,7 +141,7 @@
set name = "Search Jobban Log"
set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
@@ -153,6 +153,26 @@
for(var/t in jobban_keylist)
if(findtext(t, filter))
to_chat(usr, "[t]")
message_admins("[key_name_admin(usr)] has searched the jobban log for [filter]")
log_admin("[key_name(usr)] has searched the jobban log for [filter]")
/client/proc/vv_by_ref()
set name = "VV by Ref"
set desc = "Give this a ref string, and you will see its corresponding VV panel if it exists"
set category = "Debug"
// It's gated by "Debug Verbs", so might as well gate it to the debug permission
if(!check_rights(R_DEBUG))
return
var/refstring = input("Which reference?","Ref") as text|null
if(!refstring)
return
var/datum/D = locate(refstring)
if(!D)
to_chat(usr, "<span class='warning'>That ref string does not correspond to any datum.</span>")
return
debug_variables(D)
-36
View File
@@ -119,42 +119,6 @@ var/intercom_range_display_status = 0
qdel(F)
feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
var/list/admin_verbs_show_debug_verbs = list(
/client/proc/camera_view,
/client/proc/sec_camera_report,
/client/proc/intercom_view,
/client/proc/Cell, //More air things
/client/proc/atmosscan, //check plumbing
/client/proc/powerdebug, //check power
/client/proc/count_objects_on_z_level,
/client/proc/count_objects_all,
/client/proc/cmd_assume_direct_control,
/client/proc/startSinglo,
/client/proc/ticklag,
/client/proc/cmd_admin_grantfullaccess,
/client/proc/cmd_admin_areatest,
/client/proc/cmd_admin_rejuvenate,
/datum/admins/proc/show_traitor_panel,
/client/proc/print_jobban_old,
/client/proc/print_jobban_old_filter,
/client/proc/forceEvent,
/client/proc/nanomapgen_DumpImage,
/client/proc/reload_nanoui_resources,
/client/proc/admin_redo_space_transitions,
/client/proc/make_turf_space_map
)
/client/proc/enable_debug_verbs()
set category = "Debug"
set name = "Debug verbs"
if(!check_rights(R_DEBUG))
return
verbs += admin_verbs_show_debug_verbs
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/count_objects_on_z_level()
set category = "Mapping"
set name = "Count Objects On Level"
@@ -0,0 +1,37 @@
var/list/admin_verbs_show_debug_verbs = list(
/client/proc/camera_view,
/client/proc/sec_camera_report,
/client/proc/intercom_view,
/client/proc/Cell, //More air things
/client/proc/atmosscan, //check plumbing
/client/proc/powerdebug, //check power
/client/proc/count_objects_on_z_level,
/client/proc/count_objects_all,
/client/proc/cmd_assume_direct_control,
/client/proc/startSinglo,
/client/proc/ticklag,
/client/proc/cmd_admin_grantfullaccess,
/client/proc/cmd_admin_areatest,
/client/proc/cmd_admin_rejuvenate,
/datum/admins/proc/show_traitor_panel,
/client/proc/print_jobban_old,
/client/proc/print_jobban_old_filter,
/client/proc/forceEvent,
/client/proc/nanomapgen_DumpImage,
/client/proc/reload_nanoui_resources,
/client/proc/admin_redo_space_transitions,
/client/proc/make_turf_space_map,
/client/proc/vv_by_ref
)
// Would be nice to make this a permanent admin pref so we don't need to click it each time
/client/proc/enable_debug_verbs()
set category = "Debug"
set name = "Debug verbs"
if(!check_rights(R_DEBUG))
return
verbs += admin_verbs_show_debug_verbs
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+10 -9
View File
@@ -164,12 +164,13 @@ var/global/dmm_suite/preloader/_preloader = new
log_debug("Loaded map in [stop_watch(watch)]s.")
qdel(LM)
if(bounds[MAP_MINX] == 1.#INF) // Shouldn't need to check every item
log_debug("Min x: bounds[MAP_MINX]")
log_debug("Min y: bounds[MAP_MINY]")
log_debug("Min z: bounds[MAP_MINZ]")
log_debug("Max x: bounds[MAP_MAXX]")
log_debug("Max y: bounds[MAP_MAXY]")
log_debug("Max z: bounds[MAP_MAXZ]")
log_runtime(EXCEPTION("Bad Map bounds."), src, list(
"Min x: [bounds[MAP_MINX]]",
"Min y: [bounds[MAP_MINY]]",
"Min z: [bounds[MAP_MINZ]]",
"Max x: [bounds[MAP_MAXX]]",
"Max y: [bounds[MAP_MAXY]]",
"Max z: [bounds[MAP_MAXZ]]"))
return null
else
if(!measureOnly)
@@ -233,7 +234,7 @@ var/global/dmm_suite/preloader/_preloader = new
old_position = dpos + 1
if(!atom_def) // Skip the item if the path does not exist. Fix your crap, mappers!
log_debug("Bad path: [atom_text]")
log_runtime(EXCEPTION("Bad path: [atom_text]"), src, list("Source String: [model]", "dpos: [dpos]"))
continue
members.Add(atom_def)
@@ -384,7 +385,7 @@ var/global/dmm_suite/preloader/_preloader = new
if(findtext(trim_right,quote,1,2))
var/endquote = findtext(trim_right,quote,-1)
if(!endquote)
log_debug("Terminating quote not found!")
log_runtime(EXCEPTION("Terminating quote not found!"), src)
// Our map writer escapes quotes and curly brackets to avoid
// letting our simple parser choke on meanly-crafted names/etc
// - so we decode it here so it's back to good ol' legibility
@@ -458,7 +459,7 @@ var/global/dmm_suite/preloader/_preloader = new
try
what.deserialize(json_decode(json_data))
catch(var/exception/e)
log_debug("Bad json data: '[json_data]'")
log_runtime(EXCEPTION("Bad json data: '[json_data]'"), src)
throw e
for(var/attribute in attributes)
var/value = attributes[attribute]
@@ -8,8 +8,8 @@
/mob/living/carbon/human/interactive/away/hotel/doSetup()
..()
MYID.access += access_syndicate
RPID.access += access_syndicate
MYID.access = list(access_syndicate)
RPID.access = list(access_syndicate)
/mob/living/carbon/human/interactive/away/hotel/guard
default_job = /datum/job/officer
@@ -115,4 +115,4 @@
if(K)
K.forceMove(idloc)
else
say("Your [adjective_insult] [curse_words] card was rejected.")
say("Your [adjective_insult] [curse_words] card was rejected.")
+2 -2
View File
@@ -270,8 +270,8 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
/datum/asset/chem_master/register()
for(var/i = 1 to 20)
assets["pill[i].png"] = icon('icons/obj/chemical.dmi', "pill[i]")
for(var/i = 1 to 20)
assets["bottle[i].png"] = icon('icons/obj/chemical.dmi', "bottle[i]")
for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle"))
assets["[i].png"] = icon('icons/obj/chemical.dmi', "[i]")
for(var/asset_name in assets)
register_asset(asset_name, assets[asset_name])
+1
View File
@@ -56,6 +56,7 @@
//search the href for script injection
if( findtext(href,"<script",1,0) )
log_to_dd("Attempted use of scripts within a topic call, by [src]")
log_runtime(EXCEPTION("Attempted use of scripts within a topic call, by [src]"), src)
message_admins("Attempted use of scripts within a topic call, by [src]")
return
@@ -112,3 +112,8 @@
/datum/gear/hat/red_beret
display_name = "beret, red"
path = /obj/item/clothing/head/beret
/datum/gear/hat/sci_beret
display_name = "science beret"
path = /obj/item/clothing/head/beret/sci
allowed_roles = list("Research Director", "Scientist")
@@ -61,7 +61,7 @@
// Might as well scrub out any malformed be_special list entries while we're here
for(var/role in be_special)
if(!(role in special_roles))
log_to_dd("[C.key] had a malformed role entry: '[role]'. Removing!")
log_runtime(EXCEPTION("[C.key] had a malformed role entry: '[role]'. Removing!"), src)
be_special -= role
var/DBQuery/query = dbcon.NewQuery({"UPDATE [format_table_name("player")]
+5 -1
View File
@@ -31,10 +31,14 @@
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
//if we can equip the item anyway, don't bother with species_restricted (aslo cuts down on spam)
//if we can't equip the item anyway, don't bother with species_restricted (also cuts down on spam)
if(!..())
return 0
// Skip species restriction checks on non-equipment slots
if(slot in list(slot_r_hand, slot_l_hand, slot_in_backpack, slot_l_store, slot_r_store))
return 1
if(species_restricted && istype(M,/mob/living/carbon/human))
var/wearable = null
+5
View File
@@ -121,6 +121,11 @@
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
icon_state = "beret_ce"
/obj/item/clothing/head/beret/sci
name = "science beret"
desc = "A purple beret with the science insignia emblazoned on it. It has that authentic burning plasma smell."
icon_state = "beret_sci"
//Medical
/obj/item/clothing/head/surgery
name = "surgical cap"
+16
View File
@@ -132,6 +132,11 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "book_berner_1"
/obj/item/clothing/glasses/sunglasses/fake/fluff/kaki //Rapidvalj: Kakicharakiti
name = "broken thermonocle"
desc = "A weathered Vox thermonocle, doesn't seem to work anymore."
icon_state = "thermoncle"
/obj/item/weapon/lighter/zippo/fluff/purple // GodOfOreos: Jason Conrad
name = "purple engraved zippo"
desc = "All craftsspacemanship is of the highest quality. It is encrusted with refined plasma sheets. On the item is an image of a dwarf and the words 'Strike the Earth!' etched onto the side."
@@ -278,6 +283,12 @@
//////////// Gloves ////////////
//////////// Eye Wear ////////////
/obj/item/clothing/glasses/hud/security/sunglasses/fluff/eyepro //T0EPIC4U: Ty Omaha
name = "Tacticool EyePro"
desc = "Tacticool ballistic glasses, for making all operators look badass."
icon = 'icons/obj/custom_items.dmi'
icon_state = "eyepro"
item_state = "eyepro"
//////////// Hats ////////////
/obj/item/clothing/head/fluff/heather_winceworth // Regens: Heather Winceworth
@@ -331,6 +342,11 @@
desc = "A beret, an artist's favorite headwear. This one has two holes cut on the edges."
icon_state = "linda_beret"
/obj/item/clothing/head/fluff/kaki //Rapidvalj: Kakicharakiti
name = "sleek fancy leader hat"
desc = "A uniquely colored vox leader hat. Has some signs of wear."
icon_state = "kakicharakiti"
//////////// Suits ////////////
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
name = "Robotics labcoat"
+1 -1
View File
@@ -53,7 +53,7 @@
to_chat(A, "<span class='danger'>Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department].</span>")
else
log_to_dd("ERROR: Could not initate grey-tide. Unable to find suitable containment area.")
log_runtime("Could not initate grey-tide. Unable to find suitable containment area.", src)
kill()
/datum/event/prison_break/tick()
@@ -6,6 +6,8 @@
continue
if(H.species.virus_immune) //don't count things that are virus immune; they'll just get picked and auto-cure
continue
if(!H.get_int_organ(/obj/item/organ/internal/appendix))
continue
var/foundAlready = 0 //don't infect someone that already has the virus
for(var/datum/disease/D in H.viruses)
foundAlready = 1
@@ -14,4 +16,4 @@
var/datum/disease/D = new /datum/disease/appendicitis
H.ForceContractDisease(D)
break
break
@@ -106,7 +106,7 @@
"<span class='userdanger'>[target] hits \himself with a bottle of [src.name][head_attack_message]!</span>")
//Attack logs
add_logs(target, user, "attacked", src)
add_logs(user, target, "attacked", src)
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
SplashReagents(target)
@@ -343,4 +343,4 @@
return
to_chat(user, "<span class='info'>You snuff out the flame on \the [src].</span>")
overlays -= fire_overlay
active = 0
active = 0
@@ -47,7 +47,7 @@
if(!reagents || !reagents.total_volume)
return // The condiment might be empty after the delay.
user.visible_message("<span class='warning'>[user] feeds [M] from [src].</span>")
add_logs(M, user, "fed", reagentlist(src))
add_logs(user, M, "fed", reagentlist(src))
var/fraction = min(10/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
@@ -163,3 +163,4 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
/proc/gcwarning(msg)
log_to_dd("## GC WARNING: [msg]")
log_runtime(EXCEPTION(msg))
+1 -1
View File
@@ -96,7 +96,7 @@
/obj/item/weapon/grown/nettle/death/afterattack(mob/living/carbon/M, mob/user)
if(istype(M, /mob/living))
to_chat(M, "<span class='danger'>You are stunned by the powerful acid of the Deathnettle!</span>")
add_logs(M, user, "attacked", src)
add_logs(user, M, "attacked", src)
M.eye_blurry += force/7
if(prob(20))
+1 -1
View File
@@ -83,7 +83,7 @@
/obj/structure/bookcase/attack_hand(var/mob/user as mob)
if(contents.len)
var/obj/item/weapon/book/choice = input("Which book would you like to remove from \the [src]?") in contents as obj|null
var/obj/item/weapon/book/choice = input("Which book would you like to remove from [src]?") as null|anything in contents
if(choice)
if(user.incapacitated() || user.lying || !Adjacent(user))
return
+4 -4
View File
@@ -19,7 +19,7 @@
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("<span class='warning'>[A] has attempted to hit [D] with a [atk_verb]!</span>")
add_logs(D, A, "attempted to hit", atk_verb)
add_logs(A, D, "attempted to hit", atk_verb)
return 0
@@ -32,7 +32,7 @@
"<span class='userdanger'>[A] has hit [D] with a [atk_verb]!</span>")
D.apply_damage(damage, STAMINA, affecting, armor_block)
add_logs(D, A, "punched")
add_logs(A, D, "punched")
if(D.getStaminaLoss() > 50)
var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
if((D.stat != DEAD) && prob(knockout_prob))
@@ -61,7 +61,7 @@
return 1
/datum/martial_art/drunk_brawling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_logs(D, A, "punched")
add_logs(A, D, "punched")
A.do_attack_animation(D)
var/atk_verb = pick("jab","uppercut","overhand punch","drunken right hook","drunken left hook")
@@ -103,4 +103,4 @@
D.forcesay(hit_appends)
else if(D.lying)
D.forcesay(hit_appends)
return 1
return 1
+2 -2
View File
@@ -53,7 +53,7 @@
D.apply_damage(damage, BRUTE, affecting, armor_block)
add_logs(D, A, "punched")
add_logs(A, D, "punched")
if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
D.visible_message("<span class='danger'>[A] has weakened [D]!!</span>", \
@@ -242,4 +242,4 @@
/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(wielded)
return ..()
return 0
return 0
+1 -2
View File
@@ -38,7 +38,7 @@
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
D.apply_damage(damage, STAMINA, affecting, armor_block)
add_logs(D, A, "mimechucked")
add_logs(A, D, "mimechucked")
return 1
return basic_hit(A,D)
@@ -116,4 +116,3 @@
to_chat(usr, "<span class='notice'>Mimechucks</span>: Disarm Harm. Hits the opponent with invisible nunchucks.")
to_chat(usr, "<span class='notice'>Smokebomb</span>: Disarm Disarm. Drops a mime smokebomb.")
to_chat(usr, "<span class='notice'>Silent Palm</span>: Grab Disarm. Using mime energy throw someone back.")
+1 -1
View File
@@ -28,7 +28,7 @@
var/armor_block = D.run_armor_check(null, "melee")
D.apply_damage(30, BRUTE, null, armor_block)
D.apply_effect(6, WEAKEN, armor_block)
add_logs(D, A, "suplexed")
add_logs(A, D, "suplexed")
A.SpinAnimation(10,1)
+2 -2
View File
@@ -653,7 +653,7 @@
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
if(creator)
for(var/mob/living/L in src.loc)
add_logs(L, creator, "used a resonator field on", object="resonator")
add_logs(creator, L, "used a resonator field on", object="resonator")
to_chat(L, "<span class='danger'>The [src.name] ruptured with you in it!</span>")
L.adjustBruteLoss(resonance_damage)
else
@@ -1307,4 +1307,4 @@
if(!charged)
charged = 1
icon_state = "mining_hammer1"
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
@@ -35,7 +35,7 @@ In all, this is a lot like the monkey code. /N
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
"<span class='userdanger'>[M.name] bites [src]!</span>")
adjustBruteLoss(damage)
add_logs(src, M, "attacked", admin=0)
add_logs(M, src, "attacked", admin=0)
updatehealth()
else
to_chat(M, "<span class='warning'>[name] is too injured for that.</span>")
@@ -79,4 +79,4 @@ In all, this is a lot like the monkey code. /N
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
updatehealth()
@@ -96,7 +96,7 @@
var/blocked = 0
if(ishuman(A))
var/mob/living/carbon/human/H = A
if(H.check_shields(90, "the [name]", src, attack_type = THROWN_PROJECTILE_ATTACK))
if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
blocked = 1
if(!blocked)
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
@@ -107,6 +107,8 @@
L.Weaken(5)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
else
weakened = 2
toggle_leap(0)
pounce_cooldown = !pounce_cooldown
@@ -168,4 +170,4 @@
src.throwing = 0
return 1
return 1
@@ -116,7 +116,7 @@
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
add_logs(src, M, "attacked", admin=0)
add_logs(M, src, "attacked", admin=0)
updatehealth()
@@ -245,4 +245,4 @@
else
var/mob/living/carbon/alien/humanoid/A = new(loc)
A.key = key
qdel(src) */
qdel(src) */
+2 -2
View File
@@ -28,7 +28,7 @@
return
if(held_brain)
to_chat(user, "<span class='userdanger'>Somehow, this MMI still has a brain in it. Report this to the bug tracker.</span>")
log_to_dd("[user] tried to stick a [O] into [src] in [get_area(src)], but the held brain variable wasn't cleared")
log_runtime(EXCEPTION("[user] tried to stick a [O] into [src] in [get_area(src)], but the held brain variable wasn't cleared"), src)
return
for(var/mob/V in viewers(src, null))
V.show_message("<span class='notice'>[user] sticks \a [O] into \the [src].</span>")
@@ -101,7 +101,7 @@
//problem i was having with alien/nonalien brain drops.
/obj/item/device/mmi/proc/dropbrain(var/turf/dropspot)
if(isnull(held_brain))
log_to_dd("[src] at [loc] attempted to drop brain without a contained brain in [get_area(src)].")
log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain in [get_area(src)]."), src)
to_chat(brainmob, "<span class='userdanger'>Your MMI did not contain a brain! We'll make a new one for you, but you'd best report this to the bugtracker!</span>")
held_brain = new(dropspot) // Let's not ruin someone's round because of something dumb -- Crazylemon
held_brain.dna = brainmob.dna.Clone()
@@ -40,7 +40,7 @@
/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H)
brainmob = new(src)
if(isnull(dna)) // someone didn't set this right...
log_to_dd("[src] at [loc] did not contain a dna datum at time of removal.")
log_runtime(EXCEPTION("[src] at [loc] did not contain a dna datum at time of removal."), src)
dna = H.dna.Clone()
name = "\the [dna.real_name]'s [initial(src.name)]"
brainmob.dna = dna.Clone() // Silly baycode, what you do
@@ -72,7 +72,7 @@
// This should not ever happen, but let's be safe
/obj/item/device/mmi/posibrain/dropbrain(var/turf/dropspot)
log_to_dd("[src] at [loc] attempted to drop brain without a contained brain.")
log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src)
return
/obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H)
@@ -198,6 +198,7 @@
return // No point pinging a posibrain with a player already inside
if(check_observer(O) && (world.time >= next_ping_at))
next_ping_at = world.time + (20 SECONDS)
playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0)
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/M in viewers(T))
M.show_message("\blue The positronic brain pings softly.")
+1 -1
View File
@@ -541,7 +541,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
var/start_T_descriptor = "<font color='#6b5d00'>tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]</font>"
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
add_logs(throwable_mob, src, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
else if(!(I.flags & ABSTRACT)) //can't throw abstract items
thrown_thing = I
@@ -142,6 +142,13 @@
return ..(gibbed)
/mob/living/carbon/human/update_revive()
..()
// Update healthdoll
if(healthdoll)
// We're alive again, so re-build the entire healthdoll
healthdoll.cached_healthdoll_overlays.Cut()
/mob/living/carbon/human/proc/makeSkeleton()
var/obj/item/organ/external/head/H = get_organ("head")
if(SKELETON in src.mutations) return
@@ -819,6 +819,9 @@
src.gib()
else if(TOXIC_FARTS in mutations)
message = "<b>[src]</b> unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
else if(SUPER_FART in mutations)
message = "<b>[src]</b> unleashes a [pick("loud","deafening")] fart."
newtonian_move(dir)
else
message = "<b>[src]</b> [pick("passes wind","farts")]."
m_type = 2
@@ -410,7 +410,7 @@
M.do_attack_animation(src)
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
add_logs(src, M, "attacked")
add_logs(M, src, "attacked")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration))
return 0
@@ -19,7 +19,7 @@
..()
if((M != src) && M.a_intent != "help" && check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_logs(src, M, "attempted to touch")
add_logs(M, src, "attempted to touch")
visible_message("<span class='warning'>[M] attempted to touch [src]!</span>")
return 0
@@ -63,11 +63,11 @@
if(S.next_step(M, src))
return 1
help_shake_act(M)
add_logs(src, M, "shaked")
add_logs(M, src, "shaked")
return 1
if(health >= config.health_threshold_crit)
help_shake_act(M)
add_logs(src, M, "shaked")
add_logs(M, src, "shaked")
return 1
if(!H.check_has_mouth())
to_chat(H, "<span class='danger'>You don't have a mouth, you cannot perform CPR!</span>")
@@ -94,7 +94,7 @@
to_chat(src, "<span class='notice'>You feel a breath of fresh air enter your lungs. It feels good.</span>")
to_chat(M, "<span class='alert'>Repeat at least every 7 seconds.")
add_logs(src, M, "CPRed")
add_logs(M, src, "CPRed")
return 1
else
to_chat(M, "<span class='danger'>You need to stay still while performing CPR!</span>")
@@ -123,7 +123,7 @@
return
//we're good to suck the blood, blaah
M.mind.vampire.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
add_logs(M, src, "vampirebit")
msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]")
return
//end vampire codes
@@ -133,7 +133,7 @@
var/datum/unarmed_attack/attack = M.species.unarmed
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
add_logs(M, src, "[pick(attack.attack_verb)]ed")
if(!iscarbon(M))
LAssailant = null
@@ -172,7 +172,7 @@
if(attacker_style && attacker_style.disarm_act(H, src))
return 1
else
add_logs(src, M, "disarmed")
add_logs(M, src, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
@@ -221,7 +221,7 @@
update_inv_belt(redraw_mob)
if(slot_wear_id)
wear_id = W
if(!hud_list.len)
if(hud_list.len)
sec_hud_set_ID()
update_inv_wear_id(redraw_mob)
if(slot_wear_pda)
+4 -4
View File
@@ -803,10 +803,6 @@
if(REGEN in mutations)
heal_overall_damage(0.1, 0.1)
if(!in_stasis)
handle_organs()
handle_blood()
if(paralysis)
blinded = 1
stat = UNCONSCIOUS
@@ -893,6 +889,10 @@
if(gloves && germ_level > gloves.germ_level && prob(10))
gloves.germ_level += 1
if(!in_stasis)
handle_organs()
handle_blood()
else //dead
blinded = 1
+2 -2
View File
@@ -651,7 +651,7 @@
who.unEquip(what)
if(silent)
put_in_hands(what)
add_logs(who, src, "stripped", addition="of [what]")
add_logs(src, who, "stripped", addition="of [what]")
// The src mob is trying to place an item on someone
// Override if a certain mob should be behave differently when placing items (can't, for example)
@@ -670,7 +670,7 @@
if(what && Adjacent(who))
unEquip(what)
who.equip_to_slot_if_possible(what, where, 0, 1)
add_logs(who, src, "equipped", what)
add_logs(src, who, "equipped", what)
/mob/living/singularity_act()
+1 -1
View File
@@ -235,7 +235,7 @@
to_chat(user, "<span class='notice'>You already grabbed [src].</span>")
return
add_logs(src, user, "grabbed", addition="passively")
add_logs(user, src, "grabbed", addition="passively")
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
if(buckled)
@@ -61,11 +61,12 @@ var/global/list/empty_playable_ai_cores = list()
loc_landmark = sloc
forceMove(loc_landmark.loc)
view_core()
// Before calling this, make sure an empty core exists, or this will no-op
/mob/living/silicon/ai/proc/moveToEmptyCore()
if(!empty_playable_ai_cores.len)
log_debug("moveToEmptyCore called without any available cores")
log_runtime(EXCEPTION("moveToEmptyCore called without any available cores"), src)
return
// IsJobAvailable for AI checks that there is an empty core available in this list
@@ -73,6 +74,6 @@ var/global/list/empty_playable_ai_cores = list()
empty_playable_ai_cores -= C
forceMove(C.loc)
view_core()
qdel(C)
@@ -16,7 +16,6 @@
local_transmit = 1
ventcrawler = 2
magpulse = 1
mob_size = MOB_SIZE_TINY
// We need to keep track of a few module items so we don't need to do list operations
// every time we need them. These get set in New() after the module is chosen.
@@ -132,7 +132,6 @@
..()
icon_living = icon_state
icon_dead = icon_state
icon_resting = icon_state
access_card = new /obj/item/weapon/card/id(src)
//This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first.
access_card.access += access_robotics
@@ -852,8 +851,6 @@ Pass a positive integer as an argument to override a bot's default speed.
ejectpai(usr)
update_controls()
/mob/living/simple_animal/bot/handle_state_icons()
/mob/living/simple_animal/bot/proc/update_icon()
icon_state = "[initial(icon_state)][on]"
@@ -548,7 +548,7 @@ Auto Patrol[]"},
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_logs(src,C,"stunned")
add_logs(src, C, "stunned")
if(declare_arrests)
var/area/location = get_area(src)
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
@@ -251,7 +251,7 @@ Auto Patrol: []"},
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_logs(src,C,"stunned")
add_logs(src, C, "stunned")
if(declare_arrests)
var/area/location = get_area(src)
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
@@ -79,14 +79,14 @@
if(!istype(loc, /obj/item)) // Some silly motherfucker spawned us directly via the game panel.
message_admins("<span class='adminnotice'>Posessed object improperly spawned, deleting.</span>") // So silly admins with debug off will see the message too and not spam these things.
log_debug("[src] spawned manually, no object to assign attributes to.")
qdel()
log_runtime(EXCEPTION("[src] spawned manually, no object to assign attributes to."), src)
qdel(src)
var/turf/possessed_loc = get_turf(loc)
if(!istype(possessed_loc)) // Will this ever happen? Who goddamn knows.
message_admins("<span class='adminnotice'>Posessed object could not find turf, deleting.</span>") // So silly admins with debug off will see the message too and not spam these things.
log_debug("[src] attempted to find a turf to spawn on, and could not.")
qdel()
log_runtime(EXCEPTION("[src] attempted to find a turf to spawn on, and could not."), src)
qdel(src)
possessed_item = loc
forceMove(possessed_loc)
@@ -151,4 +151,4 @@
dir = possessed_item.dir
color = possessed_item.color
overlays = possessed_item.overlays
opacity = possessed_item.opacity
opacity = possessed_item.opacity
@@ -122,20 +122,21 @@
if(1 to 5) healths.icon_state = "health6"
if(0) healths.icon_state = "health7"
/mob/living/simple_animal/Life()
. = ..()
handle_state_icons()
/mob/living/simple_animal/proc/process_ai()
handle_automated_movement()
handle_automated_action()
handle_automated_speech()
/mob/living/simple_animal/proc/handle_state_icons()
if(resting && icon_resting && stat != DEAD)
icon_state = icon_resting
else if(stat != DEAD)
icon_state = icon_living
/mob/living/simple_animal/lay_down()
..()
handle_resting_state_icons()
/mob/living/simple_animal/proc/handle_resting_state_icons()
if(icon_resting)
if(resting && stat != DEAD)
icon_state = icon_resting
else if(stat != DEAD)
icon_state = icon_living
/mob/living/simple_animal/handle_regular_status_updates()
if(..()) //alive
+8 -7
View File
@@ -82,11 +82,12 @@
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this.
/mob/proc/update_interface()
if(client)
if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true")
update_hotkey_mode()
else
update_normal_mode()
spawn() // Spawn off so winget/winset don't delay callers.
if(client)
if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true")
update_hotkey_mode()
else
update_normal_mode()
/mob/proc/update_hotkey_mode()
var/hotkeyname = "hotkeymode"
@@ -94,7 +95,7 @@
var/hotkeys = client.hotkeylist[client.hotkeytype]
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]
client.hotkeyon = 1
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
/mob/proc/update_normal_mode()
var/hotkeyname = "macro"
@@ -102,4 +103,4 @@
var/hotkeys = client.hotkeylist[client.hotkeytype]//get the list containing the hotkey names
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much
client.hotkeyon = 0
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
+2 -2
View File
@@ -510,14 +510,14 @@
chosen_species = all_species[client.prefs.species]
if(!(chosen_species && (is_species_whitelisted(chosen_species) || has_admin_rights())))
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
log_debug("[src] had species [client.prefs.species], though they weren't supposed to. Setting to Human.")
log_runtime(EXCEPTION("[src] had species [client.prefs.species], though they weren't supposed to. Setting to Human."), src)
client.prefs.species = "Human"
var/datum/language/chosen_language
if(client.prefs.language)
chosen_language = all_languages[client.prefs.language]
if((chosen_language == null && client.prefs.language != "None") || (chosen_language && chosen_language.flags & RESTRICTED))
log_debug("[src] had language [client.prefs.language], though they weren't supposed to. Setting to None.")
log_runtime(EXCEPTION("[src] had language [client.prefs.language], though they weren't supposed to. Setting to None."), src)
client.prefs.language = "None"
/mob/new_player/proc/ViewManifest()
+3 -1
View File
@@ -37,7 +37,9 @@
O.add_ai_verbs()
O.rename_self("AI",1)
qdel(src)
spawn()
qdel(src)
return O
/mob/living/carbon/human/make_into_mask(var/should_gib = 0)
@@ -244,7 +244,7 @@
/datum/nano_module/appearance_changer/proc/can_change_head_accessory()
if(!head_organ)
log_debug("Missing head!")
log_runtime(EXCEPTION("Missing head!"), owner)
return 0
return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+1 -1
View File
@@ -114,7 +114,7 @@
// to_chat(M, "<span class='danger'>You feel a tiny prick!</span>")
. = 1
add_logs(M, user, "stabbed", object="[name]")
add_logs(user, M, "stabbed", object="[name]")
else
. = ..()
@@ -27,6 +27,15 @@
caliber = "10mm"
projectile_type = /obj/item/projectile/bullet/midbullet3
/obj/item/ammo_casing/c10mm/ap
projectile_type = /obj/item/projectile/bullet/midbullet3/ap
/obj/item/ammo_casing/c10mm/fire
projectile_type = /obj/item/projectile/bullet/midbullet3/fire
/obj/item/ammo_casing/c10mm/hp
projectile_type = /obj/item/projectile/bullet/midbullet3/hp
/obj/item/ammo_casing/c9mm
desc = "A 9mm bullet casing."
caliber = "9mm"
@@ -180,6 +180,21 @@
max_ammo = 8
multiple_sprites = 2
/obj/item/ammo_box/magazine/m10mm/fire
name = "pistol magazine (10mm incendiary)"
desc = "A gun magazine. Loaded with rounds which ignite the target."
ammo_type = /obj/item/ammo_casing/c10mm/fire
/obj/item/ammo_box/magazine/m10mm/hp
name = "pistol magazine (10mm HP)"
desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
ammo_type = /obj/item/ammo_casing/c10mm/hp
/obj/item/ammo_box/magazine/m10mm/ap
name = "pistol magazine (10mm AP)"
desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets"
ammo_type = /obj/item/ammo_casing/c10mm/ap
/obj/item/ammo_box/magazine/m10mm/empty //for maint drops
desc = "A gun magazine. Seems to be broken and can only hold one bullet. Pretty useless."
max_ammo = 1
@@ -209,7 +209,7 @@
power_supply.give(5000)
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else
else if(ismob(loc))
to_chat(loc, "<span class='warning'>[src] silently charges up.<span>")
update_icon()
+1 -1
View File
@@ -87,7 +87,7 @@
for(var/datum/reagent/R in reagents.reagent_list)
reagent_note += R.id + " ("
reagent_note += num2text(R.volume) + ") "
add_logs(L, firer, "shot", src, reagent_note)
add_logs(firer, L, "shot", src, reagent_note)
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
/obj/item/projectile/proc/vol_by_damage()
@@ -112,6 +112,20 @@
/obj/item/projectile/bullet/midbullet3
damage = 30
/obj/item/projectile/bullet/midbullet3/hp
damage = 40
armour_penetration = -50
/obj/item/projectile/bullet/midbullet3/ap
damage = 27
armour_penetration = 40
/obj/item/projectile/bullet/midbullet3/fire/on_hit(atom/target, blocked = 0)
if(..(target, blocked))
var/mob/living/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
/obj/item/projectile/bullet/heavybullet
damage = 35
+5 -5
View File
@@ -394,7 +394,7 @@
var/useramount = 30 // Last used amount
var/pillamount = 10
var/patchamount = 10
var/bottlesprite = "1" //yes, strings
var/bottlesprite = "bottle"
var/pillsprite = "1"
var/client/has_sprites = list()
var/printing = null
@@ -646,7 +646,7 @@
P.name = "[name] bottle"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
P.icon_state = "bottle"+bottlesprite
P.icon_state = bottlesprite
reagents.trans_to(P,30)
else
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc)
@@ -667,14 +667,13 @@
usr << browse(dat, "window=chem_master_iconsel;size=225x193")
return
else if(href_list["change_bottle"])
#define MAX_BOTTLE_SPRITE 20 //max icon state of the bottle sprites
var/dat = "<table>"
var/j = 0
for(var/i = 1 to MAX_BOTTLE_SPRITE)
for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle"))
j++
if(j == 1)
dat += "<tr>"
dat += "<td><a href=\"?src=\ref[src]&bottle_sprite=[i]\"><img src=\"bottle[i].png\" /></a></td>"
dat += "<td><a href=\"?src=\ref[src]&bottle_sprite=[i]\"><img src=\"[i].png\" /></a></td>"
if(j == 5)
dat += "</tr>"
j = 0
@@ -728,6 +727,7 @@
buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
data["pillsprite"] = pillsprite
data["bottlesprite"] = bottlesprite
data["mode"] = mode
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+2 -2
View File
@@ -639,7 +639,7 @@
M.adjustFireLoss(rand(0,15))
M.update_revive()
M.stat = UNCONSCIOUS
add_logs(M, M, "revived", object="strange reagent")
add_logs(M, M, "revived", object="strange reagent") //Yes, the logs say you revived yourself.
..()
/datum/reagent/strange_reagent/on_mob_life(mob/living/M)
@@ -1058,4 +1058,4 @@
else if(effect <= 8)
M.visible_message("<span class='warning'>[M] stumbles and staggers.</span>")
M.Dizzy(5)
M.Weaken(3)
M.Weaken(3)
@@ -1,27 +1,24 @@
//Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle
/obj/item/weapon/reagent_containers/glass/bottle
name = "bottle"
desc = "A small bottle."
icon = 'icons/obj/chemical.dmi'
icon_state = null
icon_state = "round_bottle"
item_state = "atoxinbottle"
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30)
flags = OPENCONTAINER
volume = 30
/obj/item/weapon/reagent_containers/glass/bottle/New()
..()
if(!icon_state)
icon_state = "bottle[rand(1,20)]"
/obj/item/weapon/reagent_containers/glass/bottle/on_reagent_change()
update_icon()
/obj/item/weapon/reagent_containers/glass/bottle/update_icon()
overlays.Cut()
underlays.Cut()
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10")
@@ -40,7 +37,7 @@
filling.icon_state = "[icon_state]100"
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
underlays += filling
if(!is_open_container())
var/image/lid = image(icon, src, "lid_bottle")
@@ -49,43 +46,37 @@
/obj/item/weapon/reagent_containers/glass/bottle/toxin
name = "toxin bottle"
desc = "A small bottle of toxins. Do not drink, it is poisonous."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle12"
icon_state = "small_bottle"
list_reagents = list("toxin" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle of cyanide. Bitter almonds?"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle12"
icon_state = "small_bottle"
list_reagents = list("cyanide" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
icon_state = "bottle"
list_reagents = list("mutagen" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/ammonia
name = "ammonia bottle"
desc = "A small bottle."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
icon_state = "bottle"
list_reagents = list("ammonia" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine
name = "diethylamine bottle"
desc = "A small bottle."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("diethylamine" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/facid
name = "Fluorosulfuric Acid Bottle"
desc = "A small bottle. Contains a small amount of Fluorosulfuric Acid"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("facid" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
@@ -98,57 +89,49 @@
/obj/item/weapon/reagent_containers/glass/bottle/capsaicin
name = "Capsaicin Bottle"
desc = "A small bottle. Contains hot sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
icon_state = "round_bottle"
list_reagents = list("capsaicin" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/frostoil
name = "Frost Oil Bottle"
desc = "A small bottle. Contains cold sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("frostoil" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/morphine
name = "Morphine Bottle"
desc = "A small bottle. Contains morphine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("morphine" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/ether
name = "Ether Bottle"
desc = "A small bottle. Contains ether."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("ether" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/charcoal
name = "Charcoal Bottle"
desc = "A small bottle. Contains charcoal."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("charcoal" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/epinephrine
name = "Epinephrine Bottle"
desc = "A small bottle. Contains epinephrine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "round_bottle"
list_reagents = list("epinephrine" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/pancuronium
name = "Pancuronium Bottle"
desc = "A small bottle of pancuronium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle14"
icon_state = "round_bottle"
list_reagents = list("pancuronium" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/sulfonal
name = "Sulfonal Bottle"
desc = "A small bottle of Sulfonal."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
icon_state = "round_bottle"
list_reagents = list("sulfonal" = 30)
//Reagent bottles
@@ -156,49 +139,52 @@
/obj/item/weapon/reagent_containers/glass/bottle/reagent
name = "Reagent Bottle"
desc = "A bottle for storing reagents"
icon_state = "rbottle"
icon_state = "reagent_bottle"
volume = 50
/obj/item/weapon/reagent_containers/glass/bottle/reagent/oil
name = "Oil Bottle"
desc = "A reagent bottle. Contains oil."
icon_state = "rbottle1"
list_reagents = list("oil" = 50)
pixel_x = -4
pixel_y = 6
/obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol
name = "Phenol Bottle"
desc = "A reagent bottle. Contains phenol."
icon_state = "rbottle2"
list_reagents = list("phenol" = 50)
pixel_x = 6
pixel_y = 6
/obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone
name = "Acetone Bottle"
desc = "A reagent bottle. Contains acetone."
icon_state = "rbottle3"
list_reagents = list("acetone" = 50)
pixel_x = -4
/obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia
name = "Ammonia Bottle"
desc = "A reagent bottle. Contains ammonia."
icon_state = "rbottle4"
list_reagents = list("ammonia" = 50)
pixel_x = 6
/obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine
name = "Diethylamine Bottle"
desc = "A reagent bottle. Contains diethylamine."
icon_state = "rbottle5"
list_reagents = list("diethylamine" = 50)
pixel_x = -4
pixel_y = -6
/obj/item/weapon/reagent_containers/glass/bottle/reagent/acid
name = "Acid Bottle"
desc = "A reagent bottle. Contains sulfuric acid."
icon_state = "rbottle6"
list_reagents = list("sacid" = 50)
pixel_x = 6
pixel_y = -6
/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde
name = "Formaldehyde Bottle"
desc = "A reagent bottle. Contains formaldehyde."
icon_state = "rbottle"
list_reagents = list("formaldehyde" = 50)
/obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine
@@ -211,7 +197,6 @@
desc = "A reagent bottle. Contains insulin."
list_reagents = list("insulin" = 50)
/obj/item/weapon/reagent_containers/glass/bottle/reagent/hairgrownium
name = "Hair Grow Gel"
desc = "A bottle full of a stimulative hair growth formula"
@@ -236,114 +221,114 @@
/obj/item/weapon/reagent_containers/glass/bottle/plasma
name = "plasma dust bottle"
desc = "A small bottle of plasma in dust form. Extremely toxic and reacts with micro-organisms inside blood."
icon_state = "bottle8"
icon_state = "wide_bottle"
list_reagents = list("plasma_dust" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine
name = "diphenhydramine bottle"
desc = "A small bottle of diphenhydramine."
icon_state = "bottle20"
icon_state = "bottle"
list_reagents = list("diphenhydramine" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/advance/flu
/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion
name = "Epiglottis virion culture bottle"
desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/advance/voice_change
/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion
name = "Liver enhancement virion culture bottle"
desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/advance/heal
/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion
name = "Hullucigen virion culture bottle"
desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/advance/hullucigen
/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
name = "Pierrot's Throat culture bottle"
desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/pierrot_throat
/obj/item/weapon/reagent_containers/glass/bottle/cold
name = "Rhinovirus culture bottle"
desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/advance/cold
/obj/item/weapon/reagent_containers/glass/bottle/retrovirus
name = "Retrovirus culture bottle"
desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/dna_retrovirus
/obj/item/weapon/reagent_containers/glass/bottle/gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
icon_state = "bottle3"
icon_state = "round_bottle"
amount_per_transfer_from_this = 5
spawned_disease = /datum/disease/gbs
/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/fake_gbs
/obj/item/weapon/reagent_containers/glass/bottle/brainrot
name = "Brainrot culture bottle"
desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/brainrot
/obj/item/weapon/reagent_containers/glass/bottle/magnitis
name = "Magnitis culture bottle"
desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/magnitis
/obj/item/weapon/reagent_containers/glass/bottle/wizarditis
name = "Wizarditis culture bottle"
desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/wizarditis
/obj/item/weapon/reagent_containers/glass/bottle/anxiety
name = "Severe Anxiety culture bottle"
desc = "A small bottle. Contains a sample of Lepidopticides."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/anxiety
/obj/item/weapon/reagent_containers/glass/bottle/beesease
name = "Beesease culture bottle"
desc = "A small bottle. Contains a sample of invasive Apidae."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/beesease
/obj/item/weapon/reagent_containers/glass/bottle/fluspanish
name = "Spanish flu culture bottle"
desc = "A small bottle. Contains a sample of Inquisitius."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/fluspanish
/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis
name = "Fungal Tuberculosis culture bottle"
desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus."
icon_state = "bottle3"
icon_state = "round_bottle"
spawned_disease = /datum/disease/tuberculosis
/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure
name = "BVAK bottle"
desc = "A small bottle containing Bio Virus Antidote Kit."
icon_state = "bottle5"
icon_state = "wide_bottle"
list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10)
@@ -328,7 +328,16 @@
amount_per_transfer_from_this = 20
possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120)
volume = 120
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_HEAD
flags = OPENCONTAINER
/obj/item/weapon/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
if(slot == slot_head && reagents.total_volume)
to_chat(user, "<span class='userdanger'>[src]'s contents spill all over you!</span>")
reagents.reaction(user, TOUCH)
reagents.clear_reagents()
/obj/item/weapon/reagent_containers/glass/bucket/attackby(obj/D, mob/user, params)
if(isprox(D))
@@ -37,7 +37,7 @@
var/contained = english_list(injected)
add_logs(M, user, "injected", src, "([contained])")
add_logs(user, M, "injected", src, "([contained])")
/obj/item/weapon/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
@@ -110,4 +110,4 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(50)
volume = 50
list_reagents = list("stimulants" = 50)
list_reagents = list("stimulants" = 50)
@@ -384,7 +384,7 @@
G.change_gender(pick(MALE,FEMALE))
G.loc = src.loc
G.key = ghost.key
add_logs(G, user, "summoned", null, "as a golem")
add_logs(user, G, "summoned", null, "as a golem")
to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
qdel(src)
+1 -1
View File
@@ -646,7 +646,7 @@
return 1
if(!shuttle_master)
log_to_dd("## ERROR: The shuttle_master controller datum is missing somehow.")
log_runtime(EXCEPTION("The shuttle_master controller datum is missing somehow."), src)
return 1
if(href_list["send"])
+1 -1
View File
@@ -243,7 +243,7 @@
user.visible_message("<span class='notice'> [user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].</span>", \
"<span class='notice'> You amputate [target]'s [affected.name] with \the [tool].</span>")
add_logs(target,user ,"surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it
add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it
var/atom/movable/thing = affected.droplimb(1,DROPLIMB_EDGE)
if(istype(thing,/obj/item))
+1 -1
View File
@@ -318,7 +318,7 @@ Large: Whether the splat should be big or not
R.reaction_turf(T, R.volume)
return
else if(source)
log_to_dd("Non-human or reagent blood source. Area: [get_area(source)], Name: [source]")
log_runtime(EXCEPTION("Non-human or reagent blood source. Area: [get_area(source)], Name: [source]"), source)
// Are we dripping or splattering?
var/list/drips = list()
+1 -1
View File
@@ -46,7 +46,7 @@ var/list/organ_cache = list()
dna = holder.dna.Clone()
species = all_species[dna.species]
else
log_to_dd("[src] at [loc] spawned without a proper DNA.")
log_runtime(EXCEPTION("[holder] spawned without a proper DNA."), holder)
var/mob/living/carbon/human/H = holder
if(istype(H))
if(dna)
@@ -412,7 +412,7 @@ This function completely restores a damaged organ to perfect condition.
last_dam = brute_dam + burn_dam
if(germ_level)
return 1
if(!wound_cleanup_timer)
if(!wound_cleanup_timer && wounds.len)
wound_cleanup_timer = addtimer(src, "cleanup_wounds", SecondsToTicks(600), 1, wounds)
if(update_icon())
@@ -39,7 +39,7 @@
var/mob/living/carbon/human/H = M
parent = H.get_organ(check_zone(parent_organ))
if(!istype(parent))
log_debug("[src] attempted to insert into a [parent_organ], but [parent_organ] wasn't an organ! [atom_loc_line(M)]")
log_runtime(EXCEPTION("[src] attempted to insert into a [parent_organ], but [parent_organ] wasn't an organ! [atom_loc_line(M)]"), src)
else
parent.internal_organs |= src
//M.internal_organs_by_name[src] |= src(H,1)
@@ -53,7 +53,7 @@
// However, you MUST set the object's positiion yourself when you call this!
/obj/item/organ/internal/remove(mob/living/carbon/M, special = 0)
if(!owner)
log_debug("\'remove\' called on [src] without an owner! Mob: [M], [atom_loc_line(M)]")
log_runtime(EXCEPTION("\'remove\' called on [src] without an owner! Mob: [M], [atom_loc_line(M)]"), src)
owner = null
if(M)
M.internal_organs -= src
@@ -65,7 +65,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/parent = H.get_organ(check_zone(parent_organ))
if(!istype(parent))
log_debug("[src] attempted to remove from a [parent_organ], but [parent_organ] didn't exist! [atom_loc_line(M)]")
log_runtime(EXCEPTION("[src] attempted to remove from a [parent_organ], but [parent_organ] didn't exist! [atom_loc_line(M)]"), src)
else
parent.internal_organs -= src
+1 -1
View File
@@ -240,7 +240,7 @@
user.visible_message("<span class='notice'> [user] has separated and extracts [target]'s [I] with \the [tool].</span>" , \
"<span class='notice'> You have separated and extracted [target]'s [I] with \the [tool].</span>")
add_logs(target,user, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
spread_germs_to_organ(I, user)
I.status |= ORGAN_CUT_AWAY
var/obj/item/thing = I.remove(target)
+3 -3
View File
@@ -239,7 +239,7 @@
user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \
"You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].")
else
log_debug("Invalid tool: '[implement_type]'")
log_runtime(EXCEPTION("Invalid tool: '[implement_type]'"), src)
return -1
..()
@@ -453,7 +453,7 @@
user.visible_message("<span class='notice'> [user] has decoupled [target]'s [I] with \the [tool].</span>" , \
"<span class='notice'> You have decoupled [target]'s [I] with \the [tool].</span>")
add_logs(target,user, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
spread_germs_to_organ(I, user)
I.status |= ORGAN_CUT_AWAY
var/obj/item/thing = I.remove(target)
@@ -530,7 +530,7 @@
"<span class='notice'> You have decoupled [target]'s [affected.name] with \the [tool].</span>")
add_logs(target,user ,"surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it
add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it
var/atom/movable/thing = affected.droplimb(1,DROPLIMB_EDGE)
if(istype(thing,/obj/item))