Merge branch 'master' of https://github.com/PolarisSS13/Polaris into battery_things

This commit is contained in:
Anewbe
2017-11-19 02:38:42 -06:00
295 changed files with 17587 additions and 15507 deletions
-15
View File
@@ -1223,21 +1223,6 @@ proc/admin_notice(var/message, var/rights)
if(istype(H))
H.regenerate_icons()
/*
helper proc to test if someone is an event manager or not. Got tired of writing this same check all over the place.
*/
/proc/is_eventM(client/C)
if(!istype(C))
return 0
if(!C.holder)
return 0
if(C.holder.rights == R_EVENT)
return 1
return 0
/proc/get_options_bar(whom, detail = 2, name = 0, link = 1, highlight_special = 1)
if(!whom)
return "<b>(*null*)</b>"
+4 -4
View File
@@ -100,18 +100,18 @@ var/datum/admin_secrets/admin_secrets = new()
/datum/admin_secret_item/admin_secret
category = /datum/admin_secret_category/admin_secrets
log = 0
permissions = R_ADMIN
permissions = R_ADMIN|R_EVENT
/datum/admin_secret_item/random_event
category = /datum/admin_secret_category/random_events
permissions = R_FUN
permissions = R_FUN|R_EVENT
warn_before_use = 1
/datum/admin_secret_item/fun_secret
category = /datum/admin_secret_category/fun_secrets
permissions = R_FUN
permissions = R_FUN|R_EVENT
warn_before_use = 1
/datum/admin_secret_item/final_solution
category = /datum/admin_secret_category/final_solutions
permissions = R_FUN|R_SERVER|R_ADMIN
permissions = R_FUN|R_SERVER|R_ADMIN|R_EVENT
+3 -7
View File
@@ -8,7 +8,6 @@ var/list/admin_verbs_default = list(
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify,
// /client/proc/check_antagonists, //shows all antags,
// /client/proc/cmd_mod_say,
/client/proc/cmd_eventM_check_new_players,
// /client/proc/deadchat //toggles deadchat on/off,
// /client/proc/toggle_ahelp_sound,
)
@@ -330,11 +329,11 @@ var/list/admin_verbs_mod = list(
)
var/list/admin_verbs_event_manager = list(
/client/proc/cmd_event_say,
/client/proc/cmd_admin_pm_context,
/client/proc/cmd_admin_pm_panel,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost,
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
/client/proc/dsay,
/client/proc/cmd_admin_subtle_message,
@@ -448,9 +447,6 @@ var/list/admin_verbs_event_manager = list(
feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_ghost()
set category = "Admin"
set name = "Aghost"
@@ -461,7 +457,7 @@ var/list/admin_verbs_event_manager = list(
if(ghost.can_reenter_corpse)
ghost.reenter_corpse()
else
ghost << "<font color='red'>Error: Aghost: Can't reenter corpse, event managers that use adminHUD while aghosting are not permitted to enter their corpse again</font>"
to_chat(ghost, "<font color='red'>Error: Aghost: Can't reenter corpse.</font>")
return
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -777,7 +773,7 @@ var/list/admin_verbs_event_manager = list(
set category = "Admin"
if(holder)
if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someont promoting you.",,"Yes","No") == "Yes")
if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someone promoting you.",,"Yes","No") == "Yes")
log_admin("[src] deadmined themself.")
message_admins("[src] deadmined themself.", 1)
deadmin()
+7 -13
View File
@@ -363,20 +363,14 @@
<td align=center><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>
"}
if(usr.client)
var/client/C = usr.client
if(is_eventM(C))
dat += {"<td align=center> N/A </td>"}
else
switch(is_special_character(M))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
switch(is_special_character(M))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
else
dat += {"<td align=center> N/A </td>"}
+3 -2
View File
@@ -36,7 +36,8 @@
if(check_rights(R_ADMIN, 0))
sender_name = "<span class='admin'>[sender_name]</span>"
for(var/client/C in admins)
C << "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
if(check_rights(R_ADMIN|R_MOD|R_SERVER))
C << "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -45,7 +46,7 @@
set name = "Esay"
set hidden = 1
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER))
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_EVENT))
return
msg = sanitize(msg)
-36
View File
@@ -65,42 +65,6 @@
message_admins("<font color='blue'><B>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</B></font>", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_eventM_check_new_players() //Allows event managers / admins to determine who the newer players are.
set category = "Admin"
set name = "Check new Players"
if(!holder)
src << "Only staff members may use this command."
var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
if(age == "All")
age = 9999999
else
age = text2num(age)
var/missing_ages = 0
var/msg = ""
var/highlight_special_characters = 1
if(is_eventM(usr.client))
highlight_special_characters = 0
for(var/client/C in clients)
if(C.player_age == "Requires database")
missing_ages = 1
continue
if(C.player_age < age)
msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old<br>"
if(missing_ages)
src << "Some accounts did not have proper ages set in their clients. This function requires database to be present"
if(msg != "")
src << browse(msg, "window=Player_age_check")
else
src << "No matches for that age range found."
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
set category = "Special Verbs"
set name = "Global Narrate"
+1 -1
View File
@@ -104,7 +104,7 @@
// Note that the current station being used will be pruned from this list upon being instantiated
destination_names = list(
"NSS Exodus in Nyx",
"NCS Northern Star in Vir",
//"NCS Northern Star in Vir",
"NLS Southern Cross in Vir",
"NAS Vir Central Command",
"a dockyard orbiting Sif",
@@ -3,6 +3,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
/datum/preferences
var/equip_preview_mob = EQUIP_PREVIEW_ALL
var/icon/bgstate = "000"
var/list/bgstate_options = list("000", "fff", "steel", "white")
/datum/category_item/player_setup_item/general/body
name = "Body"
sort_order = 3
@@ -34,6 +37,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_green"] >> pref.g_synth
S["synth_blue"] >> pref.b_synth
pref.preview_icon = null
S["bgstate"] >> pref.bgstate
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
S["species"] << pref.species
@@ -61,6 +65,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_red"] << pref.r_synth
S["synth_green"] << pref.g_synth
S["synth_blue"] << pref.b_synth
S["bgstate"] << pref.bgstate
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
if(!pref.species || !(pref.species in playable_species))
@@ -87,6 +92,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(!pref.rlimb_data) pref.rlimb_data = list()
if(!pref.body_markings) pref.body_markings = list()
else pref.body_markings &= body_marking_styles_list
if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options))
pref.bgstate = "000"
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character)
@@ -268,6 +275,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "</td><td><b>Preview</b><br>"
. += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>"
. += "<br><a href='?src=\ref[src];cycle_bg=1'>Cycle background</a>"
. += "<br><a href='?src=\ref[src];toggle_preview_value=[EQUIP_PREVIEW_LOADOUT]'>[pref.equip_preview_mob & EQUIP_PREVIEW_LOADOUT ? "Hide loadout" : "Show loadout"]</a>"
. += "<br><a href='?src=\ref[src];toggle_preview_value=[EQUIP_PREVIEW_JOB]'>[pref.equip_preview_mob & EQUIP_PREVIEW_JOB ? "Hide job gear" : "Show job gear"]</a>"
. += "</td></tr></table>"
@@ -694,6 +702,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_synth = hex2num(copytext(new_color, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["cycle_bg"])
pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options)
return TOPIC_REFRESH_UPDATE_PREVIEW
return ..()
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
@@ -34,6 +34,18 @@
display_name = "Spaceball booster pack"
path = /obj/item/weapon/pack/spaceball
/datum/gear/plushie
display_name = "plushie selection"
path = /obj/item/toy/plushie/
/datum/gear/plushie/New()
..()
var/list/plushies = list()
for(var/plushie in subtypesof(/obj/item/toy/plushie/) - /obj/item/toy/plushie/therapy)
var/obj/item/toy/plushie/plushie_type = plushie
plushies[initial(plushie_type.name)] = plushie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(plushies))
/datum/gear/flask
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
@@ -154,34 +154,10 @@
path = /obj/item/clothing/head/fedora/grey
/datum/gear/head/hairflower
display_name = "hair flower pin, red"
path = /obj/item/clothing/head/hairflower
/datum/gear/head/hairflower/yellow
display_name = "hair flower pin, yellow"
path = /obj/item/clothing/head/hairflower/yellow
/datum/gear/head/hairflower/pink
display_name = "hair flower pin, pink"
path = /obj/item/clothing/head/hairflower/pink
/datum/gear/head/hairflower/blue
display_name = "hair flower pin, blue"
path = /obj/item/clothing/head/hairflower/blue
/datum/gear/head/hairflower/violet
display_name = "hair flower pin, violet"
path = /obj/item/clothing/head/hairflower/violet
/datum/gear/head/hairflower/orange
display_name = "hair flower pin, orange"
path = /obj/item/clothing/head/hairflower/orange
/datum/gear/head/hairflower/white
display_name = "hair flower pin"
path = /obj/item/clothing/head/hairflower/white
/datum/gear/head/hairflower/white/New()
/datum/gear/head/hairflower/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -372,4 +348,4 @@
/datum/gear/head/surgical/purple
display_name = "surgical cap, purple"
path = /obj/item/clothing/head/surgery/purple
path = /obj/item/clothing/head/surgery/purple
@@ -73,10 +73,6 @@
display_name = "shoes, yellow"
path = /obj/item/clothing/shoes/yellow
/datum/gear/shoes/flats
display_name = "flats, black"
path = /obj/item/clothing/shoes/flats
/datum/gear/shoes/hitops/
display_name = "high-top, white"
path = /obj/item/clothing/shoes/hitops/
@@ -109,30 +105,6 @@
display_name = "high-top, yellow"
path = /obj/item/clothing/shoes/hitops/yellow
/datum/gear/shoes/flats/blue
display_name = "flats, blue"
path = /obj/item/clothing/shoes/flats/blue
/datum/gear/shoes/flats/brown
display_name = "flats, brown"
path = /obj/item/clothing/shoes/flats/brown
/datum/gear/shoes/flats/orange
display_name = "flats, orange"
path = /obj/item/clothing/shoes/flats/orange
/datum/gear/shoes/flats/purple
display_name = "flats, purple"
path = /obj/item/clothing/shoes/flats/purple
/datum/gear/shoes/flats/red
display_name = "flats, red"
path = /obj/item/clothing/shoes/flats/red
/datum/gear/shoes/flats/white
display_name = "flats, white"
path = /obj/item/clothing/shoes/flats/white
/datum/gear/shoes/flipflops
display_name = "flip flops"
path = /obj/item/clothing/shoes/flipflop
@@ -157,11 +129,11 @@
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/shoes/flats/color
/datum/gear/shoes/flats
display_name = "flats"
path = /obj/item/clothing/shoes/flats/white/color
/datum/gear/shoes/flats/color/New()
/datum/gear/shoes/flats/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -246,4 +218,4 @@
/datum/gear/shoes/boots/winter/hydro
display_name = "hydroponics winter boots"
path = /obj/item/clothing/shoes/boots/winter/hydro
allowed_roles = list("Botanist", "Xenobiologist")
allowed_roles = list("Botanist", "Xenobiologist")
@@ -72,6 +72,25 @@
Regardless, you find it quite difficult to land shots where you wanted them to go."
modifier_type = /datum/modifier/trait/inaccurate
/datum/trait/modifier/physical/smaller
name = "Smaller"
modifier_type = /datum/modifier/trait/smaller
mutually_exclusive = list(/datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger)
/datum/trait/modifier/physical/small
name = "Small"
modifier_type = /datum/modifier/trait/small
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger)
/datum/trait/modifier/physical/large
name = "Large"
modifier_type = /datum/modifier/trait/large
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/larger)
/datum/trait/modifier/physical/larger
name = "Larger"
modifier_type = /datum/modifier/trait/larger
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large)
// These two traits might be borderline, feel free to remove if they get abused.
/datum/trait/modifier/physical/high_metabolism
+1
View File
@@ -77,6 +77,7 @@
desc = "A pair of gloves that reach past the elbow. Fancy!"
name = "evening gloves"
icon_state = "evening_gloves"
addblends = "evening_gloves_a"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
+10
View File
@@ -34,9 +34,11 @@
/obj/item/clothing/head/hairflower/white
icon_state = "hairflower_white"
addblends = "hairflower_white_a"
/obj/item/clothing/head/hairflower/bow
icon_state = "bow"
addblends = "bow_a"
name = "hair bow"
desc = "A ribbon tied into a bow with a clip on the back to attach to hair."
item_state_slots = list(slot_r_hand_str = "pill", slot_l_hand_str = "pill")
@@ -155,6 +157,7 @@
/obj/item/clothing/head/flatcap/grey
icon_state = "flat_capw"
addblends = "flat_capw_a"
item_state_slots = list(slot_r_hand_str = "greysoft", slot_l_hand_str = "greysoft")
/obj/item/clothing/head/pirate
@@ -300,6 +303,7 @@
name = "hijab"
desc = "A veil that is wrapped to cover the head and chest"
icon_state = "hijab"
addblends = "hijab_a"
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
body_parts_covered = 0
flags_inv = BLOCKHAIR
@@ -308,12 +312,14 @@
name = "kippa"
desc = "A small, brimless cap."
icon_state = "kippa"
addblends = "kippa_a"
body_parts_covered = 0
/obj/item/clothing/head/turban
name = "turban"
desc = "A cloth used to wind around the head"
icon_state = "turban"
addblends = "turban_a"
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
body_parts_covered = 0
flags_inv = BLOCKHEADHAIR
@@ -322,24 +328,28 @@
name = "taqiyah"
desc = "A short, rounded skullcap usually worn for religious purposes."
icon_state = "taqiyah"
addblends = "taqiyah_a"
item_state_slots = list(slot_r_hand_str = "taq", slot_l_hand_str = "taq")
/obj/item/clothing/head/beanie
name = "beanie"
desc = "A head-hugging brimless winter cap. This one is tight."
icon_state = "beanie"
addblends = "beanie_a"
body_parts_covered = 0
/obj/item/clothing/head/beanie_loose
name = "loose beanie"
desc = "A head-hugging brimless winter cap. This one is loose."
icon_state = "beanie_hang"
addblends = "beanie_hang_a"
body_parts_covered = 0
/obj/item/clothing/head/beretg
name = "beret"
desc = "A beret, an artists favorite headwear."
icon_state = "beret_g"
addblends = "beret_g_a"
body_parts_covered = 0
/obj/item/clothing/head/sombrero
+1
View File
@@ -54,6 +54,7 @@
name = "white flats"
desc = "Shiny white flats."
icon_state = "flatswhite"
addblends = "flatswhite_a"
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
/obj/item/clothing/shoes/flats/white/color
@@ -124,23 +124,27 @@
name = "flip flops"
desc = "A pair of foam flip flops. For those not afraid to show a little ankle."
icon_state = "thongsandal"
addblends = "thongsandal_a"
/obj/item/clothing/shoes/athletic
name = "athletic shoes"
desc = "A pair of sleek atheletic shoes. Made by and for the sporty types."
icon_state = "sportshoe"
addblends = "sportshoe_a"
item_state_slots = list(slot_r_hand_str = "sportheld", slot_l_hand_str = "sportheld")
/obj/item/clothing/shoes/skater
name = "skater shoes"
desc = "A pair of wide shoes with thick soles. Designed for skating."
icon_state = "skatershoe"
addblends = "skatershoe_a"
item_state_slots = list(slot_r_hand_str = "skaterheld", slot_l_hand_str = "skaterheld")
/obj/item/clothing/shoes/heels
name = "high heels"
desc = "A pair of high-heeled shoes. Fancy!"
icon_state = "heels"
addblends = "heels_a"
/obj/item/clothing/shoes/footwraps
name = "cloth footwraps"
@@ -150,20 +150,20 @@
item_state_slots = list(slot_r_hand_str = "medical_voidsuit_bio", slot_l_hand_str = "medical_voidsuit_bio")
armor = list(melee = 45, bullet = 5, laser = 20, energy = 5, bomb = 15, bio = 100, rad = 75)
//Medical Surplus Voidsuit
//Medical Streamlined Voidsuit
/obj/item/clothing/head/helmet/space/void/medical/alt
name = "streamlined medical voidsuit helmet"
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a fetching green."
icon_state = "rig0-medicalalt"
armor = list(melee = 30, bullet = 5, laser = 10,energy = 5, bomb = 5, bio = 100, rad = 60)
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
light_overlay = "helmet_light_dual_green"
/obj/item/clothing/suit/space/void/medical/alt
icon_state = "rig-medicalalt"
name = "streamlined medical voidsuit"
desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology, without sacrificing comfort or style."
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
armor = list(melee = 30, bullet = 5, laser = 10,energy = 5, bomb = 5, bio = 100, rad = 60)
slowdown = 0
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
//Security
/obj/item/clothing/head/helmet/space/void/security
@@ -54,7 +54,7 @@
//Breach thresholds, should ideally be inherited by most (if not all) voidsuits.
//With 0.2 resiliance, will reach 10 breach damage after 3 laser carbine blasts or 8 smg hits.
breach_threshold = 18
breach_threshold = 12
can_breach = 1
//Inbuilt devices.
@@ -277,6 +277,7 @@ obj/item/clothing/suit/kimono
name = "kimono"
desc = "A traditional Japanese kimono."
icon_state = "kimono"
addblends = "kimono_a"
/*
* coats
@@ -344,6 +345,7 @@ obj/item/clothing/suit/storage/toggle/peacoat
name = "peacoat"
desc = "A well-tailored, stylish peacoat."
icon_state = "peacoat"
addblends = "peacoat_a"
item_state_slots = list(slot_r_hand_str = "peacoat", slot_l_hand_str = "peacoat")
flags_inv = HIDEHOLSTER
/*
@@ -45,6 +45,16 @@
mob_overlay = image("icon" = sprite_sheets[wearer.species.get_bodytype(wearer)], "icon_state" = "[tmp_icon_state]")
else
mob_overlay = image("icon" = INV_ACCESSORIES_DEF_ICON, "icon_state" = "[tmp_icon_state]")
if(addblends)
var/icon/base = new/icon("icon" = mob_overlay.icon, "icon_state" = mob_overlay.icon_state)
var/addblend_icon = new/icon("icon" = mob_overlay.icon, "icon_state" = src.addblends)
if(color)
base.Blend(src.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
mob_overlay = image(base)
else
mob_overlay.color = src.color
return mob_overlay
//when user attached an accessory to S
@@ -37,6 +37,7 @@
/obj/item/clothing/accessory/armband/med/color
name = "armband"
desc = "A fancy armband."
addblends = "med_a"
/obj/item/clothing/accessory/armband/medblue
name = "EMT armband"
@@ -627,17 +627,20 @@
name = "long dress"
desc = "A long dress."
icon_state = "whitedress2"
addblends = "whitedress2_a"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/white3
name = "short dress"
desc = "A short, plain dress."
icon_state = "whitedress3"
addblends = "whitedress3_a"
/obj/item/clothing/under/dress/white4
name = "long flared dress"
desc = "A long white dress that flares out at the bottom."
icon_state = "whitedress4"
addblends = "whitedress4_a"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/darkred
+1
View File
@@ -121,6 +121,7 @@
name = "yoga pants"
desc = "A pair of tight-fitting yoga pants for those lazy days."
icon_state = "yogapants"
addblends = "yogapants_a"
/*
* Baggy Pants
+1
View File
@@ -49,6 +49,7 @@
/var/list/economic_species_modifier = list(
/datum/species/human = 10,
/datum/species/human/vatgrown = 10,
/datum/species/skrell = 12,
/datum/species/unathi = 7,
/datum/species/tajaran = 7,
@@ -18,7 +18,9 @@
else
io_list.Add(new io_type(src, io_entry, default_data))
/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, var/new_data)
/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, datum/new_data)
if (istype(new_data) && !isweakref(new_data))
new_data = weakref(new_data)
var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number)
return pin.write_data_to_pin(new_data)
@@ -112,6 +112,8 @@ list[](
/datum/integrated_io/proc/write_data_to_pin(var/new_data)
if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want.
if(istext(new_data))
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
data = new_data
holder.on_data_written()
@@ -4,11 +4,14 @@
/datum/integrated_io/string/ask_for_pin_data(mob/user)
var/new_data = input("Please type in a string.","[src] string writing") as null|text
if(holder.check_interactivity(user) )
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(new_data && holder.check_interactivity(user) )
to_chat(user, "<span class='notice'>You input [new_data ? "new_data" : "NULL"] into the pin.</span>")
write_data_to_pin(new_data)
/datum/integrated_io/string/write_data_to_pin(var/new_data)
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(isnull(new_data) || istext(new_data))
data = new_data
holder.on_data_written()
@@ -125,6 +125,7 @@
if("string")
accepting_refs = 0
new_data = input("Now type in a string.","[src] string writing") as null|text
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(istext(new_data) && CanInteract(user, physical_state))
data_to_write = new_data
to_chat(user, "<span class='notice'>You set \the [src]'s memory to \"[new_data]\".</span>")
@@ -29,6 +29,28 @@
if(assembly)
assembly.give_power(adjusted_power)
/obj/item/integrated_circuit/passive/power/starter
name = "starter"
desc = "This tiny circuit will send a pulse right after device is turned on, or when power is restored."
icon_state = "led"
complexity = 1
activators = list("pulse out" = IC_PINTYPE_PULSE_OUT)
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
var/is_charge=0
/obj/item/integrated_circuit/passive/power/starter/make_energy()
if(assembly.battery)
if(assembly.battery.charge)
if(!is_charge)
activate_pin(1)
is_charge=1
else
is_charge=0
else
is_charge=0
return FALSE
// For implants.
/obj/item/integrated_circuit/passive/power/metabolic_siphon
name = "metabolic siphon"
@@ -82,6 +104,44 @@
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
spawn_flags = IC_SPAWN_RESEARCH
var/power_amount = 250
//fuel cell
/obj/item/integrated_circuit/passive/power/chemical_cell
name = "fuel cell"
desc = "Produces electricity from chemicals."
icon_state = "chemical_cell"
extended_desc = "This is effectively an internal beaker. It will consume and produce power from phoron, slime jelly, welding fuel, carbon,\
ethanol, nutriments and blood, in order of decreasing efficiency. It will consume fuel only if the battery can take more energy."
flags = OPENCONTAINER
complexity = 4
inputs = list()
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/volume = 60
var/list/fuel = list("phoron" = 50000, "slimejelly" = 25000, "fuel" = 15000, "carbon" = 10000, "ethanol"= 10000, "nutriment" =8000, "blood" = 5000)
/obj/item/integrated_circuit/passive/power/chemical_cell/New()
..()
create_reagents(volume)
/obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
/obj/item/integrated_circuit/passive/power/chemical_cell/make_energy()
if(assembly)
for(var/I in fuel)
if((assembly.battery.maxcharge-assembly.battery.charge) / CELLRATE > fuel[I])
if(reagents.remove_reagent(I, 1))
assembly.give_power(fuel[I])
// For really fat machines.
/obj/item/integrated_circuit/passive/power/relay/large
@@ -27,13 +27,10 @@
/obj/item/integrated_circuit/transfer/multiplexer/do_work()
var/input_index = get_pin_data(IC_INPUT, 1)
var/output = null
if(!isnull(input_index) && (input_index >= 1 && input_index < inputs.len))
output = get_pin_data(IC_INPUT, input_index + 1)
set_pin_data(IC_OUTPUT, 1, output)
push_data()
set_pin_data(IC_OUTPUT, 1,get_pin_data(IC_INPUT, input_index + 1))
push_data()
activate_pin(2)
/obj/item/integrated_circuit/transfer/multiplexer/medium
@@ -79,10 +76,8 @@
/obj/item/integrated_circuit/transfer/demultiplexer/do_work()
var/output_index = get_pin_data(IC_INPUT, 1)
var/output = get_pin_data(IC_INPUT, 2)
for(var/i = 1 to outputs.len)
set_pin_data(IC_OUTPUT, i, i == output_index ? output : null)
set_pin_data(IC_OUTPUT, i, i == output_index ? get_pin_data(IC_INPUT, 2) : null)
activate_pin(2)
@@ -101,4 +96,51 @@
name = "sixteen demultiplexer"
icon_state = "dmux16"
w_class = ITEMSIZE_SMALL
number_of_outputs = 16
/obj/item/integrated_circuit/transfer/pulsedemultiplexer
name = "two pulse demultiplexer"
desc = "Selector switch to choose the pin to be activated by number."
extended_desc = "The first input pin is used to select which of the pulse out pins will be activated after activation of the circuit. \
If the output selection is outside the valid range then no output is given."
complexity = 2
icon_state = "dmux2"
inputs = list("output selection" = IC_PINTYPE_NUMBER)
outputs = list()
activators = list("select" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 4
var/number_of_outputs = 2
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/New()
for(var/i = 1 to number_of_outputs)
// outputs += "output [i]"
activators["output [i]"] = IC_PINTYPE_PULSE_OUT
complexity = number_of_outputs
..()
desc += " It has [number_of_outputs] output pins."
extended_desc += " This pulse demultiplexer has a range from 1 to [activators.len - 1]."
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work()
var/output_index = get_pin_data(IC_INPUT, 1)
if(output_index == Clamp(output_index, 1, number_of_outputs))
activate_pin(round(output_index + 1 ,1))
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium
name = "four pulse demultiplexer"
icon_state = "dmux4"
number_of_outputs = 4
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/large
name = "eight pulse demultiplexer"
icon_state = "dmux8"
w_class = ITEMSIZE_SMALL
number_of_outputs = 8
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/huge
name = "sixteen pulse demultiplexer"
icon_state = "dmux16"
w_class = ITEMSIZE_SMALL
number_of_outputs = 16
@@ -110,8 +110,10 @@
/obj/item/integrated_circuit/input/adv_med_scanner
name = "integrated advanced medical analyser"
desc = "A very small version of the medbot's medical analyser. This allows the machine to know how healthy someone is. \
name = "integrated advanced medical analyzer"
desc = "A very small version of the medibot's medical analyzer. This allows the machine to know how healthy someone is. \
This type is much more precise, allowing the machine to know much more about the target than a normal analyzer."
icon_state = "medscan_adv"
complexity = 12
@@ -134,7 +136,9 @@
var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living/carbon/human)
if(!istype(H)) //Invalid input
return
if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range..
var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100
var/missing_health = H.getMaxHealth() - H.health
@@ -336,6 +340,7 @@
// Set the pins so when someone sees them, they won't show as null
set_pin_data(IC_INPUT, 1, frequency)
set_pin_data(IC_INPUT, 2, code)
push_data()
/obj/item/integrated_circuit/input/signaler/Destroy()
if(radio_controller)
@@ -464,6 +469,7 @@
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
if(!T)
push_data()
return
set_pin_data(IC_OUTPUT, 1, T.x)
@@ -486,7 +492,7 @@
"speaker" = IC_PINTYPE_STRING,
"message" = IC_PINTYPE_STRING
)
activators = list("on message received" = IC_PINTYPE_PULSE_IN, "on translation" = IC_PINTYPE_PULSE_OUT)
activators = list("on message received" = IC_PINTYPE_PULSE_OUT, "on translation" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 15
@@ -618,4 +624,235 @@
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/atmo_scanner
name = "integrated atmospheric analyser"
desc = "The same atmospheric analysis module that is integrated into every PDA. \
This allows the machine to know the composition, temperature and pressure of the surrounding atmosphere."
icon_state = "medscan_adv"
complexity = 9
inputs = list()
outputs = list(
"pressure" = IC_PINTYPE_NUMBER,
"temperature" = IC_PINTYPE_NUMBER,
"oxygen" = IC_PINTYPE_NUMBER,
"nitrogen" = IC_PINTYPE_NUMBER,
"carbon dioxide" = IC_PINTYPE_NUMBER,
"phoron" = IC_PINTYPE_NUMBER,
"other" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 60
/obj/item/integrated_circuit/input/atmo_scanner/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
if (total_moles)
var/o2_level = environment.gas["oxygen"]/total_moles
var/n2_level = environment.gas["nitrogen"]/total_moles
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
var/phoron_level = environment.gas["phoron"]/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
set_pin_data(IC_OUTPUT, 1, pressure)
set_pin_data(IC_OUTPUT, 2, round(environment.temperature-T0C,0.1))
set_pin_data(IC_OUTPUT, 3, round(o2_level*100,0.1))
set_pin_data(IC_OUTPUT, 4, round(n2_level*100,0.1))
set_pin_data(IC_OUTPUT, 5, round(co2_level*100,0.1))
set_pin_data(IC_OUTPUT, 6, round(phoron_level*100,0.01))
set_pin_data(IC_OUTPUT, 7, round(unknown_level, 0.01))
else
set_pin_data(IC_OUTPUT, 1, 0)
set_pin_data(IC_OUTPUT, 2, -273.15)
set_pin_data(IC_OUTPUT, 3, 0)
set_pin_data(IC_OUTPUT, 4, 0)
set_pin_data(IC_OUTPUT, 5, 0)
set_pin_data(IC_OUTPUT, 6, 0)
set_pin_data(IC_OUTPUT, 7, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/pressure_sensor
name = "integrated pressure sensor"
desc = "A tiny pressure sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"pressure" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/pressure_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
if (total_moles)
set_pin_data(IC_OUTPUT, 1, pressure)
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/temperature_sensor
name = "integrated temperature sensor"
desc = "A tiny temperature sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"temperature" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/temperature_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
set_pin_data(IC_OUTPUT, 1, round(environment.temperature-T0C,0.1))
else
set_pin_data(IC_OUTPUT, 1, -273.15)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/oxygen_sensor
name = "integrated oxygen sensor"
desc = "A tiny oxygen sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"oxygen" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/oxygen_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/o2_level = environment.gas["oxygen"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(o2_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/co2_sensor
name = "integrated co2 sensor"
desc = "A tiny carbon dioxide sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"co2" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/co2_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(co2_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/nitrogen_sensor
name = "integrated nitrogen sensor"
desc = "A tiny nitrogen sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"nitrogen" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/nitrogen_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/n2_level = environment.gas["nitrogen"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(n2_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/phoron_sensor
name = "integrated phoron sensor"
desc = "A tiny phoron gas sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"phoron" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/phoron_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/phoron_level = environment.gas["phoron"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(phoron_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
@@ -52,12 +52,123 @@
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/search
name = "search circuit"
desc = "This circuit will give index of desired element in the list."
extended_desc = "Search will start at 1 position and will return first matching position."
inputs = list(
"list" = IC_PINTYPE_LIST,
"item" = IC_PINTYPE_ANY
)
outputs = list(
"index" = IC_PINTYPE_NUMBER
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/search/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/item = get_pin_data(IC_INPUT, 2)
set_pin_data(IC_OUTPUT, 1, input_list.Find(item))
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/at
name = "at circuit"
desc = "This circuit will pick an element from a list by index."
extended_desc = "If there is no element with such index, result will be null."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_NUMBER
)
outputs = list("item" = IC_PINTYPE_ANY)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/at/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/index = get_pin_data(IC_INPUT, 2)
var/item = input_list[index]
set_pin_data(IC_OUTPUT, 1, item)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/delete
name = "delete circuit"
desc = "This circuit will delete the element from a list by index."
extended_desc = "If there is no element with such index, result list will be unchanged."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_NUMBER
)
outputs = list(
"item" = IC_PINTYPE_LIST
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/delete/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/list/red_list = list()
var/index = get_pin_data(IC_INPUT, 2)
var/j = 0
for(var/I in input_list)
j = j + 1
if(j != index)
red_list.Add(I)
set_pin_data(IC_OUTPUT, 1, red_list)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/write
name = "write circuit"
desc = "This circuit will write element in list with given index."
extended_desc = "If there is no element with such index, it will give the same list, as before."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_NUMBER,
"item" = IC_PINTYPE_ANY
)
outputs = list(
"redacted list" = IC_PINTYPE_LIST
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/write/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/index = get_pin_data(IC_INPUT, 2)
var/item = get_pin_data(IC_INPUT, 3)
input_list[index] = item
set_pin_data(IC_OUTPUT, 1, input_list)
push_data()
activate_pin(2)
obj/item/integrated_circuit/list/len
name = "len circuit"
desc = "This circuit will give length of the list."
inputs = list(
"list" = IC_PINTYPE_LIST,
)
outputs = list(
"item" = IC_PINTYPE_NUMBER
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/len/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
set_pin_data(IC_OUTPUT, 1, input_list.len)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/jointext
name = "join text circuit"
desc = "This circuit will add all elements of a list into one string, seperated by a character."
extended_desc = "Default settings will encode the entire list into a string."
inputs = list(
"list to join" = IC_PINTYPE_LIST,
"list to join" = IC_PINTYPE_LIST,//
"delimiter" = IC_PINTYPE_CHAR,
"start" = IC_PINTYPE_NUMBER,
"end" = IC_PINTYPE_NUMBER
@@ -40,8 +40,15 @@
O.push_data()
activate_pin(2)
/obj/item/integrated_circuit/memory/tiny
name = "small memory circuit"
desc = "This circuit can store two pieces of data."
icon_state = "memory2"
power_draw_per_use = 2
number_of_pins = 2
/obj/item/integrated_circuit/memory/medium
name = "memory circuit"
name = "medium memory circuit"
desc = "This circuit can store four pieces of data."
icon_state = "memory4"
power_draw_per_use = 2
@@ -37,9 +37,7 @@
amount_to_move = 20000
/obj/item/integrated_circuit/power/transmitter/do_work()
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
set_pin_data(IC_OUTPUT, 3, null)
var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
if(AM)
if(!assembly)
@@ -72,7 +70,15 @@
set_pin_data(IC_OUTPUT, 2, cell.maxcharge)
set_pin_data(IC_OUTPUT, 3, cell.percent())
activate_pin(2)
push_data()
return TRUE
else
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
set_pin_data(IC_OUTPUT, 3, null)
activate_pin(2)
push_data()
return FALSE
return FALSE
/obj/item/integrated_circuit/power/transmitter/large/do_work()
@@ -1,6 +1,8 @@
/obj/item/integrated_circuit/reagent
category_text = "Reagent"
var/volume = 0
unacidable = 1
phoronproof = 1
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/New()
@@ -18,13 +20,23 @@
complexity = 20
cooldown_per_use = 30 SECONDS
inputs = list()
outputs = list()
activators = list("create smoke" = IC_PINTYPE_PULSE_IN)
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list("create smoke" = IC_PINTYPE_PULSE_IN,"on smoked" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 3)
volume = 100
power_draw_per_use = 20
/obj/item/integrated_circuit/reagent/smoke/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
/obj/item/integrated_circuit/reagent/smoke/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/reagent/smoke/do_work()
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new()
@@ -33,52 +45,141 @@
for(var/i = 1 to 8)
smoke_system.start()
reagents.clear_reagents()
activate_pin(2)
/obj/item/integrated_circuit/reagent/injector
name = "integrated hypo-injector"
desc = "This scary looking thing is able to pump liquids into whatever it's pointed at."
icon_state = "injector"
extended_desc = "This autoinjector can push reagents into another container or someone else outside of the machine. The target \
must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing."
must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. A negative amount makes the injector draw out reagents."
flags = OPENCONTAINER
complexity = 20
cooldown_per_use = 6 SECONDS
inputs = list("target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER)
inputs_default = list("2" = 5)
outputs = list()
activators = list("inject" = IC_PINTYPE_PULSE_IN)
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list("inject" = IC_PINTYPE_PULSE_IN, "on injected" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
volume = 30
power_draw_per_use = 15
var/direc = 1
var/transfer_amount = 10
/obj/item/integrated_circuit/reagent/injector/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/reagent/injector/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
/obj/item/integrated_circuit/reagent/injector/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 2)
if(new_amount < 0)
new_amount = -new_amount
direc = 0
else
direc = 1
if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, volume)
transfer_amount = new_amount
/obj/item/integrated_circuit/reagent/injector/proc/inject_amount()
var/amount = get_pin_data(IC_INPUT, 2)
if(isnum(amount))
return Clamp(amount, 0, 30)
/obj/item/integrated_circuit/reagent/injector/do_work()
set waitfor = 0 // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing
var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
if(!istype(AM)) //Invalid input
activate_pin(3)
return
if(!reagents.total_volume) // Empty
return
if(AM.can_be_injected_by(src))
if(isliving(AM))
var/mob/living/L = AM
var/turf/T = get_turf(AM)
T.visible_message("<span class='warning'>[src] is trying to inject [L]!</span>")
sleep(3 SECONDS)
if(!L.can_be_injected_by(src))
if(direc == 1)
if(!istype(AM)) //Invalid input
activate_pin(3)
return
if(!reagents.total_volume) // Empty
activate_pin(3)
return
if(AM.can_be_injected_by(src))
if(isliving(AM))
var/mob/living/L = AM
var/turf/T = get_turf(AM)
T.visible_message("<span class='warning'>[src] is trying to inject [L]!</span>")
sleep(3 SECONDS)
if(!L.can_be_injected_by(src))
activate_pin(3)
return
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(L, transfer_amount, CHEM_BLOOD)
message_admins("[src] injected \the [L] with [trans]u of [contained].")
to_chat(AM, "<span class='notice'>You feel a tiny prick!</span>")
visible_message("<span class='warning'>[src] injects [L]!</span>")
else
reagents.trans_to(AM, transfer_amount)
else
if(reagents.total_volume >= volume) // Full
activate_pin(3)
return
var/obj/target = AM
if(!target.reagents)
activate_pin(3)
return
var/turf/TS = get_turf(src)
var/turf/TT = get_turf(AM)
if(!TS.Adjacent(TT))
activate_pin(3)
return
var/tramount = Clamp(min(transfer_amount, reagents.maximum_volume - reagents.total_volume), 0, reagents.maximum_volume)
if(ismob(target))//Blood!
if(istype(target, /mob/living/carbon))
var/mob/living/carbon/T = target
if(!T.dna)
if(T.reagents.trans_to_obj(src, tramount))
activate_pin(2)
else
activate_pin(3)
return
if(NOCLONE in T.mutations) //target done been et, no more blood in him
if(T.reagents.trans_to_obj(src, tramount))
activate_pin(2)
else
activate_pin(3)
return
return
var/datum/reagent/B
if(istype(T, /mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species && !H.should_have_organ(O_HEART))
H.reagents.trans_to_obj(src, tramount)
else
B = T.take_blood(src, tramount)
else
B = T.take_blood(src,tramount)
if (B)
reagents.reagent_list |= B
reagents.update_total()
on_reagent_change()
reagents.handle_reactions()
B = null
visible_message( "<span class='notice'>Machine takes a blood sample from [target].</span>")
else
activate_pin(3)
return
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(L, inject_amount(), CHEM_BLOOD)
message_admins("[src] injected \the [L] with [trans]u of [contained].")
to_chat(AM, "<span class='notice'>You feel a tiny prick!</span>")
visible_message("<span class='warning'>[src] injects [L]!</span>")
else
reagents.trans_to(AM, inject_amount())
else //if not mob
if(!target.reagents.total_volume)
visible_message( "<span class='notice'>[target] is empty.</span>")
activate_pin(3)
return
target.reagents.trans_to_obj(src, tramount)
activate_pin(2)
/obj/item/integrated_circuit/reagent/pump
name = "reagent pump"
@@ -96,11 +197,17 @@
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/transfer_amount = 10
var/direc = 1
power_draw_per_use = 10
/obj/item/integrated_circuit/reagent/pump/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 3)
if(!isnull(new_amount))
if(new_amount < 0)
new_amount = -new_amount
direc = 0
else
direc = 1
if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, 50)
transfer_amount = new_amount
@@ -111,17 +218,23 @@
if(!istype(source) || !istype(target)) //Invalid input
return
var/turf/T = get_turf(src)
if(source.Adjacent(T) && target.Adjacent(T))
var/turf/TS = get_turf(source)
var/turf/TT = get_turf(target)
if(TS.Adjacent(T) && TT.Adjacent(T))
if(!source.reagents || !target.reagents)
return
if(ismob(source) || ismob(target))
return
if(!source.is_open_container() || !target.is_open_container())
return
if(!target.reagents.get_free_space())
return
source.reagents.trans_to(target, transfer_amount)
if(direc)
if(!target.reagents.get_free_space())
return
source.reagents.trans_to(target, transfer_amount)
else
if(!source.reagents.get_free_space())
return
target.reagents.trans_to(source, transfer_amount)
activate_pin(2)
/obj/item/integrated_circuit/reagent/storage
@@ -132,12 +245,18 @@
flags = OPENCONTAINER
complexity = 4
inputs = list()
outputs = list("volume used" = IC_PINTYPE_NUMBER)
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
volume = 60
/obj/item/integrated_circuit/reagent/storage/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/reagent/storage/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
@@ -150,4 +269,95 @@
flags = OPENCONTAINER | NOREACT
complexity = 8
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
origin_tech = list(TECH_MATERIALS = 4, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/storage/big
name = "big reagent storage"
desc = "Stores liquid inside, and away from electrical components. Can store up to 180u."
icon_state = "reagent_storage_big"
extended_desc = "This is effectively an internal beaker."
flags = OPENCONTAINER
complexity = 16
volume = 180
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/storage/scan
name = "reagent scanner"
desc = "Stores liquid inside, and away from electrical components. Can store up to 60u. On pulse this beaker will send list of contained reagents."
icon_state = "reagent_scan"
extended_desc = "Mostly useful for reagent filter."
flags = OPENCONTAINER
complexity = 8
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF,"list of reagents" = IC_PINTYPE_LIST)
activators = list("scan" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/storage/scan/do_work()
var/cont[0]
for(var/datum/reagent/RE in reagents.reagent_list)
cont += RE.id
set_pin_data(IC_OUTPUT, 3, cont)
push_data()
/obj/item/integrated_circuit/reagent/filter
name = "reagent filter"
desc = "Filtering liquids by list of desired or unwanted reagents."
icon_state = "reagent_filter"
extended_desc = "This is a filter which will move liquids from the source ref to the target ref. \
It will move all reagents, except list, given in fourth pin if amount value is positive.\
Or it will move only desired reagents if amount is negative, The third pin determines \
how much reagent is moved per pulse, between 0 and 50. Amount is given for each separate reagent."
flags = OPENCONTAINER
complexity = 8
inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER, "list of reagents" = IC_PINTYPE_LIST)
inputs_default = list("3" = 5)
outputs = list()
activators = list("transfer reagents" = IC_PINTYPE_PULSE_IN, "on transfer" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/transfer_amount = 10
var/direc = 1
power_draw_per_use = 10
/obj/item/integrated_circuit/reagent/filter/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 3)
if(new_amount < 0)
new_amount = -new_amount
direc = 0
else
direc = 1
if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, 50)
transfer_amount = new_amount
/obj/item/integrated_circuit/reagent/filter/do_work()
var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable)
var/list/demand = get_pin_data(IC_INPUT, 4)
if(!istype(source) || !istype(target)) //Invalid input
return
var/turf/T = get_turf(src)
if(source.Adjacent(T) && target.Adjacent(T))
if(!source.reagents || !target.reagents)
return
if(ismob(source) || ismob(target))
return
if(!source.is_open_container() || !target.is_open_container())
return
if(!target.reagents.get_free_space())
return
for(var/datum/reagent/G in source.reagents.reagent_list)
if (!direc)
if(G.id in demand)
source.reagents.trans_id_to(target, G.id, transfer_amount)
else
if(!(G.id in demand))
source.reagents.trans_id_to(target, G.id, transfer_amount)
activate_pin(2)
push_data()
+7
View File
@@ -41,6 +41,7 @@
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
var/icon_scale_percent // Makes the holder's icon get scaled up or down.
/datum/modifier/New(var/new_holder, var/new_origin)
holder = new_holder
@@ -62,6 +63,8 @@
holder.modifiers.Remove(src)
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
holder.update_modifier_visuals()
if(icon_scale_percent) // Correct the scaling.
holder.update_transform()
qdel(src)
// Override this for special effects when it gets removed.
@@ -117,6 +120,8 @@
modifiers.Add(mod)
if(mod.mob_overlay_state)
update_modifier_visuals()
if(mod.icon_scale_percent)
update_transform()
return mod
@@ -198,6 +203,8 @@
effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
causing reagents in your body to process, and hunger to occur [multipler_to_percentage(metabolism_percent, TRUE)] [metabolism_percent > 1.0 ? "faster" : "slower"]."
if(!isnull(icon_scale_percent))
effects += "Your appearance is [multipler_to_percentage(icon_scale_percent, TRUE)] [icon_scale_percent > 1 ? "larger" : "smaller"]."
return jointext(effects, "<br>")
+25 -1
View File
@@ -58,4 +58,28 @@
desc = "Your body's metabolism is slower than average."
metabolism_percent = 0.5
incoming_healing_percent = 0.6
incoming_healing_percent = 0.6
/datum/modifier/trait/larger
name = "Larger"
desc = "Your body is larger than average."
icon_scale_percent = 1.2
/datum/modifier/trait/large
name = "Large"
desc = "Your body is a bit larger than average."
icon_scale_percent = 1.1
/datum/modifier/trait/small
name = "Small"
desc = "Your body is a bit smaller than average."
icon_scale_percent = 0.95
/datum/modifier/trait/smaller
name = "Smaller"
desc = "Your body is smaller than average."
icon_scale_percent = 0.9
+12 -7
View File
@@ -201,6 +201,11 @@ Works together with spawning an observer, noted above.
/mob/proc/ghostize(var/can_reenter_corpse = 1)
if(key)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.vr_holder && !can_reenter_corpse)
H.exit_vr()
return 0
var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
@@ -243,9 +248,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/turf/location = get_turf(src)
message_admins("[key_name_admin(usr)] has ghosted. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(usr)] has ghosted.")
var/mob/observer/dead/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
announce_ghost_joinleave(ghost)
var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
if(ghost)
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
announce_ghost_joinleave(ghost)
/mob/observer/dead/can_use_hands() return 0
/mob/observer/dead/is_active() return 0
@@ -310,19 +316,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!client)
return
var/mentor = is_eventM(usr.client)
if(!config.antag_hud_allowed && (!client.holder || mentor))
if(!config.antag_hud_allowed && !client.holder)
src << "<font color='red'>Admins have disabled this for this round.</font>"
return
var/mob/observer/dead/M = src
if(jobban_isbanned(M, "AntagHUD"))
src << "<font color='red'><B>You have been banned from using this feature</B></font>"
return
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && (!client.holder || mentor))
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !client.holder)
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
if(response == "No") return
M.can_reenter_corpse = 0
if(!M.has_enabled_antagHUD && (!client.holder || mentor))
if(!M.has_enabled_antagHUD && !client.holder)
M.has_enabled_antagHUD = 1
if(M.antagHUD)
M.antagHUD = 0
@@ -15,7 +15,7 @@
if (I_GRAB)
if (M == src)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, M, src )
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, src )
M.put_in_active_hand(G)
@@ -56,4 +56,4 @@
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("<font color='red'><B>[] has attempted to punch []!</B></font>", M, src), 1)
return
return
+17 -9
View File
@@ -109,20 +109,28 @@
playsound(loc, "sparks", 50, 1, -1)
if (shock_damage > 15)
src.visible_message(
"<font color='red'>[src] was shocked by \the [source]!</font>", \
"<font color='red'><B>You feel a powerful shock course through your body!</B></font>", \
"<font color='red'>You hear a heavy electrical crack.</font>" \
"<span class='warning'>[src] was electrocuted[source ? " by the [source]" : ""]!</span>", \
"<span class='danger'>You feel a powerful shock course through your body!</span>", \
"<span class='warning'>You hear a heavy electrical crack.</span>" \
)
if(stun)
Stun(10)//This should work for now, more is really silly and makes you lay there forever
Weaken(10)
else
src.visible_message(
"<font color='red'>[src] was mildly shocked by \the [source].</font>", \
"<font color='red'>You feel a mild shock course through your body.</font>", \
"<font color='red'>You hear a light zapping.</font>" \
"<span class='warning'>[src] was shocked[source ? " by the [source]" : ""].</span>", \
"<span class='warning'>You feel a shock course through your body.</span>", \
"<span class='warning'>You hear a zapping sound.</span>" \
)
if(stun)
switch(shock_damage)
if(16 to 20)
Stun(2)
if(21 to 25)
Weaken(2)
if(26 to 30)
Weaken(5)
if(31 to INFINITY)
Weaken(10) //This should work for now, more is really silly and makes you lay there forever
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, loc)
s.start()
@@ -25,7 +25,7 @@
weapon_edge = 0
hit_embed_chance = I.force/(I.w_class*3)
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
//Melee weapon embedded object code.
if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I) && I.embed_chance > 0)
+25 -1
View File
@@ -1,5 +1,15 @@
/mob/living/carbon/human/gib()
if(vr_holder)
exit_vr()
// Delete the link, because this mob won't be around much longer
vr_holder.vr_link = null
if(vr_link)
vr_link.exit_vr()
vr_link.vr_holder = null
vr_link = null
for(var/obj/item/organ/I in internal_organs)
I.removed()
if(istype(loc,/turf))
@@ -80,6 +90,20 @@
if(wearing_rig)
wearing_rig.notify_ai("<span class='danger'>Warning: user death event. Mobility control passed to integrated intelligence system.</span>")
// If the body is in VR, move the mind back to the real world
if(vr_holder)
src.exit_vr()
src.vr_holder.vr_link = null
for(var/obj/item/W in src)
src.drop_from_inventory(W)
// If our mind is in VR, bring it back to the real world so it can die with its body
if(vr_link)
vr_link.exit_vr()
vr_link.vr_holder = null
vr_link = null
to_chat(src, "<span class='danger'>Everything abruptly stops.</span>")
return ..(gibbed,species.get_death_message(src))
/mob/living/carbon/human/proc/ChangeToHusk()
@@ -113,4 +137,4 @@
mutations.Add(SKELETON)
status_flags |= DISFIGURED
update_body(1)
return
return
@@ -18,17 +18,9 @@
var/skiparms = 0
var/skipfeet = 0
var/cloaked = 0 // 0 for normal, 1 for cloaked close
if(mind && mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer))
var/distance = get_dist(user, src)
if(distance > 2)
src.loc.examine(user)
return
else
cloaked = 1
if(alpha <= 50)
src.loc.examine(user)
return
var/looks_synth = looksSynthetic()
@@ -97,8 +89,6 @@
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
T = gender_datums[PLURAL]
if(cloaked)
T = gender_datums[NEUTER]
else if(species && species.ambiguous_genders)
var/can_detect_gender = FALSE
@@ -458,25 +448,18 @@
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
if(print_flavor_text() && !cloaked)
if(print_flavor_text())
msg += "[print_flavor_text()]\n"
msg += "*---------*</span><br>"
msg += applying_pressure
if (pose && !cloaked)
if (pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "[T.He] [pose]"
user << jointext(msg, null)
/mob/living/carbon/human/get_description_fluff()
if(mind && mind.changeling && mind.changeling.cloaked)
return ""
else
return ..()
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
/proc/hasHUD(mob/M as mob, hudtype)
if(istype(M, /mob/living/carbon/human))
+55 -3
View File
@@ -318,8 +318,6 @@
//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
/mob/living/carbon/human/proc/get_visible_name()
if( mind && mind.changeling && mind.changeling.cloaked)
return "Unknown"
if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible
return get_id_name("Unknown")
if( head && (head.flags_inv&HIDEFACE) )
@@ -1136,6 +1134,9 @@
if(species.default_language)
add_language(species.default_language)
if(species.icon_scale != 1)
update_transform()
if(species.base_color && default_colour)
//Apply colour.
r_skin = hex2num(copytext(species.base_color,2,4))
@@ -1523,4 +1524,55 @@
var/turf/T = get_turf(src)
var/obj/item/clothing/accessory/permit/drone/permit = new(T)
permit.set_name(real_name)
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
// enter_vr is called on the original mob, and puts the mind into the supplied vr mob
/mob/living/carbon/human/proc/enter_vr(var/mob/living/carbon/human/avatar) // Avatar is currently a human, because we have preexisting setup code for appearance manipulation, etc.
if(!istype(avatar))
return
// Link the two mobs for client transfer
avatar.vr_holder = src
src.teleop = avatar
src.vr_link = avatar // Can't reuse vr_holder so that death can automatically eject users from VR
// Move the mind
avatar.Sleeping(1)
src.mind.transfer_to(avatar)
to_chat(avatar, "<b>You have enterred Virtual Reality!\nAll normal gameplay rules still apply.\nWounds you suffer here won't persist when you leave VR, but some of the pain will.\nYou can leave VR at any time by using the \"Exit Virtual Reality\" verb in the Abilities tab, or by ghosting.\nYou can modify your appearance by using various \"Change \[X\]\" verbs in the Abilities tab.</b>")
to_chat(avatar, "<span class='notice'> You black out for a moment, and wake to find yourself in a new body in virtual reality.</span>") // So this is what VR feels like?
// exit_vr is called on the vr mob, and puts the mind back into the original mob
/mob/living/carbon/human/verb/exit_vr()
set name = "Exit Virtual Reality"
set category = "Abilities"
if(!vr_holder)
return
if(!mind)
return
var/total_damage
// Tally human damage
if(ishuman(src))
var/mob/living/carbon/human/H = src
total_damage = H.getBruteLoss() + H.getFireLoss() + H.getOxyLoss() + H.getToxLoss()
// Move the mind back to the original mob
// vr_holder.Sleeping(1)
src.mind.transfer_to(vr_holder)
to_chat(vr_holder, "<span class='notice'>You black out for a moment, and wake to find yourself back in your own body.</span>")
// Two-thirds damage is transferred as agony for /humans
// Getting hurt in VR doesn't damage the physical body, but you still got hurt.
if(ishuman(vr_holder) && total_damage)
var/mob/living/carbon/human/V = vr_holder
V.stun_effect_act(0, total_damage*2/3, null) // 200 damage leaves the user in paincrit for several seconds, agony reaches 0 after around 2m.
to_chat(vr_holder, "<span class='warning'>Pain from your time in VR lingers.</span>") // 250 damage leaves the user unconscious for several seconds in addition to paincrit
// Maintain a link with the mob, but don't use teleop
vr_holder.vr_link = src
vr_holder.teleop = null
if(istype(vr_holder.loc, /obj/machinery/vr_sleeper))
var/obj/machinery/vr_sleeper/V = vr_holder.loc
V.go_out()
@@ -425,9 +425,9 @@ This function restores all organs.
zone = BP_HEAD
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
if(Debug2)
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, an armor value of [blocked], and a soak value of [soaked]."
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
@@ -442,7 +442,7 @@ This function restores all organs.
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
if(organ && organ.organ_can_feel_pain())
emote("scream")
..(damage, damagetype, def_zone, blocked)
..(damage, damagetype, def_zone, blocked, soaked)
return 1
//Handle BRUTE and BURN damage
@@ -451,12 +451,18 @@ This function restores all organs.
if(blocked >= 100)
return 0
if(soaked >= damage)
return 0
if(!organ) return 0
if(blocked)
blocked = (100-blocked)/100
damage = (damage * blocked)
if(soaked)
damage -= soaked
if(Debug2)
world.log << "## DEBUG: [src] was hit for [damage]."
@@ -29,7 +29,6 @@
var/g_synth //Same as above
var/b_synth //Same as above
var/size_multiplier = 1 //multiplier for the mob's icon size
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
@@ -103,3 +102,8 @@
var/step_count = 0 // Track how many footsteps have been taken to know when to play footstep sounds
can_be_antagged = TRUE
// Used by mobs in virtual reality to point back to the "real" mob the client belongs to.
var/mob/living/carbon/human/vr_holder = null
// Used by "real" mobs after they leave a VR session
var/mob/living/carbon/human/vr_link = null
@@ -30,6 +30,8 @@
var/tail_animation // If set, the icon to obtain tail animation states from.
var/tail_hair
var/icon_scale = 1 // Makes the icon larger/smaller.
var/race_key = 0 // Used for mob icon cache string.
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/mob_size = MOB_MEDIUM
@@ -275,11 +277,14 @@
var/t_him = "them"
if(ishuman(target))
var/mob/living/carbon/human/T = target
switch(T.identifying_gender)
if(MALE)
t_him = "him"
if(FEMALE)
t_him = "her"
if(!T.species.ambiguous_genders || (T.species.ambiguous_genders && H.species == T.species))
switch(T.identifying_gender)
if(MALE)
t_him = "him"
if(FEMALE)
t_him = "her"
else
t_him = "them"
else
switch(target.gender)
if(MALE)
@@ -148,9 +148,16 @@ var/list/wrapped_species_by_ref = list()
last_special = world.time + 50
var/new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src)
var/new_species = null
new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src)
if(!new_species || !all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
return
shapeshifter_change_shape(new_species)
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null)
if(!new_species)
return
wrapped_species_by_ref["\ref[src]"] = new_species
visible_message("<span class='notice'>\The [src] shifts and contorts, taking the form of \a [new_species]!</span>")
@@ -85,7 +85,7 @@ var/datum/species/shapeshifter/promethean/prometheans
/mob/living/carbon/human/proc/regenerate
)
valid_transform_species = list("Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
valid_transform_species = list("Human", "Vatborn", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
monochromatic = 1
var/heal_rate = 0.5 // Temp. Regen per tick.
@@ -39,6 +39,8 @@
burn_mod = 0.85
metabolic_rate = 0.85
item_slowdown_mod = 0.5
mob_size = MOB_LARGE
blood_volume = 840
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_UNATHI)
name_language = LANGUAGE_UNATHI
@@ -0,0 +1,32 @@
// ### Wooo, inheritance. Basically copying everything I don't need to edit from prometheans, because they mostly work already.
// ### Any and all of this is open to change for balance or whatever.
// ###
// ###
// Species definition follows.
/datum/species/shapeshifter/promethean/avatar
name = "Virtual Reality Avatar"
name_plural = "Virtual Reality Avatars"
blurb = "A 3-dimensional representation of some sort of animate object used to display the presence and actions of some-one or -thing using a virtual reality program."
show_ssd = "eerily still"
death_message = "flickers briefly, their gear falling in a heap on the floor around their motionless body."
knockout_message = "has been knocked unconscious!"
spawn_flags = SPECIES_IS_RESTRICTED
speech_bubble_appearance = "cyber"
male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime, O_EYES = /obj/item/organ/internal/eyes) // Slime core.
heal_rate = 0 // Avatars don't naturally heal like prometheans, at least not for now
/datum/species/shapeshifter/promethean/avatar/handle_death(var/mob/living/carbon/human/H)
return
/datum/species/shapeshifter/promethean/avatar/handle_environment_special(var/mob/living/carbon/human/H)
return
@@ -159,16 +159,29 @@ Please contact me on #coderbus IRC. ~Carn x
for(var/inner_entry in entry)
overlays += inner_entry
update_transform()
/mob/living/carbon/human/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
desired_scale *= species.icon_scale
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
// Regular stuff again.
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
var/matrix/M = matrix()
M.Turn(90)
M.Scale(size_multiplier)
M.Scale(desired_scale)
M.Translate(1,-6)
src.transform = M
else
var/matrix/M = matrix()
M.Scale(size_multiplier)
M.Translate(0, 16*(size_multiplier-1))
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
var/global/list/damage_icon_parts = list()
@@ -293,6 +306,8 @@ var/global/list/damage_icon_parts = list()
base_icon = chest.get_icon()
for(var/obj/item/organ/external/part in organs)
if(isnull(part) || part.is_stump())
continue
var/icon/temp = part.get_icon(skeleton)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
@@ -381,11 +396,13 @@ var/global/list/damage_icon_parts = list()
face_standing.Blend(facial_s, ICON_OVERLAY)
if(h_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
face_standing.Blend(hair_s, ICON_OVERLAY)
@@ -503,7 +520,16 @@ var/global/list/damage_icon_parts = list()
//need to append _s to the icon state for legacy compatibility
var/image/standing = image(icon = under_icon, icon_state = "[under_state]_s")
standing.color = w_uniform.color
if(w_uniform.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = w_uniform.addblends)
if(w_uniform.color)
base.Blend(w_uniform.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = w_uniform.color
//apply blood overlay
if(w_uniform.blood_DNA)
@@ -567,7 +593,15 @@ var/global/list/damage_icon_parts = list()
bloodsies.color = gloves.blood_color
standing.overlays += bloodsies
gloves.screen_loc = ui_gloves
standing.color = gloves.color
if(gloves.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = gloves.addblends)
if(gloves.color)
base.Blend(gloves.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = gloves.color
overlays_standing[GLOVES_LAYER] = standing
else
if(blood_DNA)
@@ -588,7 +622,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = glasses.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[glasses.icon_state]")
else
standing = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]")
standing.color = glasses.color
if(glasses.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = glasses.addblends)
if(glasses.color)
base.Blend(glasses.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = glasses.color
overlays_standing[GLASSES_LAYER] = standing
else
@@ -616,7 +658,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = l_ear.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[t_type]")
else
standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
standing.color = l_ear.color
if(l_ear.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = l_ear.addblends)
if(l_ear.color)
base.Blend(l_ear.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = l_ear.color
both.overlays += standing
if(r_ear)
@@ -630,7 +680,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = r_ear.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[t_type]")
else
standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
standing.color = r_ear.color
if(r_ear.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = r_ear.addblends)
if(r_ear.color)
base.Blend(r_ear.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = r_ear.color
both.overlays += standing
overlays_standing[EARS_LAYER] = both
@@ -664,8 +722,18 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
standing.color = shoes.color
if(shoes.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = shoes.addblends)
if(shoes.color)
base.Blend(shoes.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = shoes.color
overlays_standing[shoe_layer] = standing
else
if(feet_blood_DNA)
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "shoeblood")
@@ -731,7 +799,15 @@ var/global/list/damage_icon_parts = list()
if(hat.on && light_overlay_cache[cache_key])
standing.overlays |= light_overlay_cache[cache_key]
standing.color = head.color
if(head.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = head.addblends)
if(head.color)
base.Blend(head.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = head.color
overlays_standing[HEAD_LAYER] = standing
else
@@ -766,7 +842,15 @@ var/global/list/damage_icon_parts = list()
if(!i_state) i_state = i.icon_state
standing.overlays += image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[i_state]")
standing.color = belt.color
if(belt.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = belt.addblends)
if(belt.color)
base.Blend(belt.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = belt.color
overlays_standing[belt_layer] = standing
else
@@ -791,7 +875,16 @@ var/global/list/damage_icon_parts = list()
t_icon = wear_suit.item_icons[slot_wear_suit_str]
standing = image("icon" = t_icon, "icon_state" = "[wear_suit.icon_state]")
standing.color = wear_suit.color
if(wear_suit.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = wear_suit.addblends)
if(wear_suit.color)
base.Blend(wear_suit.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = wear_suit.color
if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) )
drop_from_inventory(handcuffed)
@@ -841,7 +934,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = wear_mask.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[wear_mask.icon_state]")
else
standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
standing.color = wear_mask.color
if(wear_mask.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = wear_mask.addblends)
if(wear_mask.color)
base.Blend(wear_mask.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = wear_mask.color
if( !istype(wear_mask, /obj/item/clothing/mask/smokable/cigarette) && wear_mask.blood_DNA )
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "maskblood")
@@ -883,7 +984,15 @@ var/global/list/damage_icon_parts = list()
//apply color
var/image/standing = image(icon = overlay_icon, icon_state = overlay_state)
standing.color = back.color
if(back.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = back.addblends)
if(back.color)
base.Blend(back.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = back.color
//create the image
overlays_standing[BACK_LAYER] = standing
+2
View File
@@ -34,6 +34,8 @@
adjustCloneLoss(damage * blocked)
if(HALLOSS)
adjustHalLoss(damage * blocked)
if(ELECTROCUTE)
electrocute_act(damage, used_weapon, 1.0, def_zone)
flash_weak_pain()
updatehealth()
return 1
+14
View File
@@ -1004,3 +1004,17 @@ default behaviour is:
// Called by job_controller.
/mob/living/proc/equip_post_job()
return
/mob/living/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
// Now for the regular stuff.
var/matrix/M = matrix()
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
+1 -15
View File
@@ -17,10 +17,6 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
/mob/living/silicon/ai/proc/toggle_hologram_movement,
/mob/living/silicon/ai/proc/toggle_hidden_verbs,
)
var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.com/1172/,
/mob/living/silicon/ai/proc/ai_announcement,
/mob/living/silicon/ai/proc/ai_call_shuttle,
/mob/living/silicon/ai/proc/ai_camera_track,
@@ -160,6 +156,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
add_language(LANGUAGE_EAL, 1)
add_language(LANGUAGE_SCHECHI, 1)
add_language(LANGUAGE_SIGN, 1)
add_language(LANGUAGE_ROOTLOCAL, 1)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
@@ -794,16 +791,5 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
if(rig)
rig.force_rest(src)
/mob/living/silicon/ai/proc/toggle_hidden_verbs()
set name = "Toggle Hidden Verbs"
set category = "AI Settings"
if(/mob/living/silicon/ai/proc/ai_announcement in verbs)
src << "Extra verbs toggled off."
verbs -= ai_verbs_hidden
else
src << "Extra verbs toggled on."
verbs |= ai_verbs_hidden
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
@@ -9,7 +9,7 @@
health = 200
mob_bump_flag = ROBOT
mob_swap_flags = ROBOT|MONKEY|SLIME|SIMPLE_ANIMAL
mob_swap_flags = ~HEAVY
mob_push_flags = ~HEAVY //trundle trundle
var/lights_on = 0 // Is our integrated light on?
@@ -394,6 +394,11 @@
C.toggled = 1
src << "<font color='red'>You enable [C.name].</font>"
/mob/living/silicon/robot/verb/spark_plug() //So you can still sparkle on demand without violence.
set category = "Robot Commands"
set name = "Emit Sparks"
spark_system.start()
// this function displays jetpack pressure in the stat panel
/mob/living/silicon/robot/proc/show_jetpack_pressure()
// if you have a jetpack, show the internal tank pressure
@@ -637,7 +642,8 @@
else
if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) )
spark_system.start()
if(W.force > 0)
spark_system.start()
return ..()
/mob/living/silicon/robot/attack_hand(mob/user)
@@ -90,6 +90,7 @@
var/assist_distance = 25 // Radius in which I'll ask my comrades for help.
var/supernatural = 0 // If the mob is supernatural (used in null-rod stuff for banishing?)
var/grab_resist = 75 // Chance of me resisting a grab attempt.
var/taser_kill = 1 // Is the mob weak to tasers
//Attack ranged settings
var/ranged = 0 // Do I attack at range?
@@ -107,7 +108,9 @@
var/friendly = "nuzzles" // What mobs do to people when they aren't really hostile
var/attack_sound = null // Sound to play when I attack
var/environment_smash = 0 // How much environment damage do I do when I hit stuff?
var/melee_miss_chance = 25 // percent chance to miss a melee attack.
var/melee_miss_chance = 15 // percent chance to miss a melee attack.
var/melee_attack_minDelay = 5 // How long between attacks at least
var/melee_attack_maxDelay = 10 // How long between attacks at most
//Special attacks
var/spattack_prob = 0 // Chance of the mob doing a special attack (0 for never)
@@ -1168,7 +1171,7 @@
if(!Adjacent(target_mob))
return
if(!client)
sleep(rand(8) + 8)
sleep(rand(melee_attack_minDelay, melee_attack_maxDelay))
if(isliving(target_mob))
var/mob/living/L = target_mob
@@ -1437,16 +1440,30 @@
//Shot with taser/stunvolver
/mob/living/simple_animal/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null)
var/stunDam = 0
var/agonyDam = 0
if(taser_kill)
var/stunDam = 0
var/agonyDam = 0
if(stun_amount)
stunDam += stun_amount * 0.5
adjustFireLoss(stunDam)
if(stun_amount)
stunDam += stun_amount * 0.5
adjustFireLoss(stunDam)
if(agony_amount)
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
if(agony_amount)
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
/mob/living/simple_animal/emp_act(severity)
if(!isSynthetic())
return
switch(severity)
if(1)
adjustFireLoss(rand(15, 25))
if(2)
adjustFireLoss(rand(10, 18))
if(3)
adjustFireLoss(rand(5, 12))
if(4)
adjustFireLoss(rand(1, 6))
// Force it to target something
/mob/living/simple_animal/proc/taunt(var/mob/living/new_target, var/forced = FALSE)
+1
View File
@@ -534,6 +534,7 @@
if(M != usr) return
if(usr == src) return
if(!Adjacent(usr)) return
if(usr.incapacitated(INCAPACITATION_STUNNED | INCAPACITATION_FORCELYING | INCAPACITATION_KNOCKOUT | INCAPACITATION_RESTRAINED)) return //Incapacitated.
if(istype(M,/mob/living/silicon/ai)) return
show_inv(usr)
+1 -1
View File
@@ -400,7 +400,7 @@ proc/is_blind(A)
return // Can't talk in deadchat if you can't see it.
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_eventM(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
if(M.client && (!istype(M, /mob/new_player) && M.stat == DEAD) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
if(M.forbid_seeing_deadchat && !M.client.holder)
@@ -258,7 +258,7 @@
mannequin.delete_inventory(TRUE)
dress_preview_mob(mannequin)
preview_icon = icon('icons/effects/effects.dmi', "nothing")
preview_icon = icon('icons/effects/128x48.dmi', bgstate)
preview_icon.Scale(48+32, 16+32)
mannequin.dir = NORTH
@@ -45,7 +45,8 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/Human_face.dmi' // default icon for all hairs
icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs
var/icon_add = 'icons/mob/human_face.dmi'
bald
name = "Bald"
@@ -323,7 +324,7 @@
name = "Overeye Long"
icon_state = "hair_longovereye"
fag
flowhair
name = "Flow Hair"
icon_state = "hair_f"
+2
View File
@@ -18,6 +18,8 @@
return 0
/obj/item/organ/internal/appendix/process()
..()
if(!inflamed || !owner)
return
+15 -15
View File
@@ -44,21 +44,6 @@
tmp_owner.internal_organs_by_name[organ_tag] = new replace_path(tmp_owner, 1)
tmp_owner = null
/obj/item/organ/internal/pariah_brain
name = "brain remnants"
desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
organ_tag = "brain"
parent_organ = BP_HEAD
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
vital = 1
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
/obj/item/organ/internal/brain/New()
..()
health = config.default_brain_health
@@ -127,6 +112,21 @@
target.key = brainmob.key
..()
/obj/item/organ/internal/pariah_brain
name = "brain remnants"
desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
organ_tag = "brain"
parent_organ = BP_HEAD
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
vital = 1
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
/obj/item/organ/internal/brain/slime
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
+1
View File
@@ -9,6 +9,7 @@
/obj/item/organ/internal/kidneys/process()
..()
if(!owner) return
// Coffee is really bad for you with busted kidneys.
@@ -58,5 +58,7 @@
if (prob(3))
take_damage(1,silent=prob(30))
//if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE, others are handled on each specific organ
//Nothing that generic internal organs do for this
if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
if (prob(50))
take_damage(1,silent=prob(15))
+16 -11
View File
@@ -91,6 +91,9 @@ var/list/organ_cache = list()
if(owner && vital)
owner.death()
/obj/item/organ/proc/adjust_germ_level(var/amount) // Unless you're setting germ level directly to 0, use this proc instead
germ_level = Clamp(germ_level + amount, 0, INFECTION_LEVEL_MAX)
/obj/item/organ/process()
if(loc != owner)
@@ -117,9 +120,9 @@ var/list/organ_cache = list()
if(config.organs_decay) damage += rand(1,3)
if(damage >= max_damage)
damage = max_damage
germ_level += rand(2,6)
adjust_germ_level(rand(2,6))
if(germ_level >= INFECTION_LEVEL_TWO)
germ_level += rand(2,6)
adjust_germ_level(rand(2,6))
if(germ_level >= INFECTION_LEVEL_THREE)
die()
@@ -158,12 +161,12 @@ var/list/organ_cache = list()
owner.adjustToxLoss(infection_damage)
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
germ_level--
adjust_germ_level(-1)
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
germ_level++
adjust_germ_level(1)
if(germ_level >= INFECTION_LEVEL_ONE)
. = 1 //Organ qualifies for effect-specific processing
@@ -179,7 +182,7 @@ var/list/organ_cache = list()
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30)
. = 3 //Organ qualifies for effect-specific processing
germ_level++ //Germ_level increases without overdose of antibiotics
adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
@@ -193,13 +196,13 @@ var/list/organ_cache = list()
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting)
if(1 to 50)
germ_level++
adjust_germ_level(1)
if(51 to 200)
germ_level += rand(1,2)
adjust_germ_level(rand(1,2))
if(201 to 500)
germ_level += rand(2,3)
adjust_germ_level(rand(2,3))
if(501 to INFINITY)
germ_level += rand(3,5)
adjust_germ_level(rand(3,5))
owner.reagents.add_reagent("toxin", rand(1,2))
/obj/item/organ/proc/receive_chem(chemical as obj)
@@ -238,9 +241,11 @@ var/list/organ_cache = list()
if (germ_level < INFECTION_LEVEL_ONE)
germ_level = 0 //cure instantly
else if (germ_level < INFECTION_LEVEL_TWO)
germ_level -= 6 //at germ_level == 500, this should cure the infection in a minute
adjust_germ_level(-6) //at germ_level < 500, this should cure the infection in a minute
else if (germ_level < INFECTION_LEVEL_THREE)
adjust_germ_level(-2) //at germ_level < 1000, this will cure the infection in 5 minutes
else
germ_level -= 2 //at germ_level == 1000, this will cure the infection in 5 minutes
adjust_germ_level(-1) // You waited this long to get treated, you don't really deserve this organ
//Adds autopsy data for used_weapon.
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
+14 -11
View File
@@ -71,7 +71,7 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
//Head markings, duplicated (sadly) below.
//Head markings.
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
@@ -89,11 +89,13 @@ var/global/list/limb_icon_cache = list()
overlays |= facial_s
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style]
if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_ADD)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
overlays |= hair_s
return mob_icon
@@ -130,14 +132,15 @@ var/global/list/limb_icon_cache = list()
mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
//Body markings, does not include head, duplicated (sadly) above.
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], ICON_ADD)
overlays |= mark_s //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
//Body markings, actually does not include head this time. Done separately above.
if(!istype(src,/obj/item/organ/external/head))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], ICON_ADD)
overlays |= mark_s //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
+102
View File
@@ -0,0 +1,102 @@
// Ported from TG. Known issue: Throw hit can possibly double-proc. Seems to be throw code.
/obj/item/weapon/paperplane
name = "paper plane"
desc = "Paper folded into the shape of a plane."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paperplane"
throw_range = 7
throw_speed = 1
throwforce = 0
w_class = ITEMSIZE_TINY
var/obj/item/weapon/paper/internalPaper
/obj/item/weapon/paperplane/New(loc, obj/item/weapon/paper/newPaper)
. = ..()
pixel_y = rand(-8, 8)
pixel_x = rand(-9, 9)
if(newPaper)
internalPaper = newPaper
flags = newPaper.flags
color = newPaper.color
newPaper.forceMove(src)
else
internalPaper = new /obj/item/weapon/paper(src)
update_icon()
/obj/item/weapon/paperplane/Destroy()
if(internalPaper)
qdel(internalPaper)
internalPaper = null
return ..()
/obj/item/weapon/paperplane/update_icon()
overlays.Cut()
var/list/stamped = internalPaper.stamped
if(!stamped)
stamped = new
else if(stamped)
for(var/S in stamped)
var/obj/item/weapon/stamp/ = S
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi', "paperplane_[initial(stamp.icon_state)]")
overlays += stampoverlay
/obj/item/weapon/paperplane/attack_self(mob/user)
to_chat(user, "<span class='notice'>You unfold [src].</span>")
var/atom/movable/internal_paper_tmp = internalPaper
internal_paper_tmp.forceMove(loc)
internalPaper = null
qdel(src)
user.put_in_hands(internal_paper_tmp)
/obj/item/weapon/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params)
..()
if(istype(P, /obj/item/weapon/pen))
to_chat(user, "<span class='notice'>You should unfold [src] before changing it.</span>")
return
else if(istype(P, /obj/item/weapon/stamp)) //we don't randomize stamps on a paperplane
internalPaper.attackby(P, user) //spoofed attack to update internal paper.
update_icon()
else if(is_hot(P))
if(user.disabilities & CLUMSY && prob(10))
user.visible_message("<span class='warning'>[user] accidentally ignites themselves!</span>", \
"<span class='userdanger'>You miss the [src] and accidentally light yourself on fire!</span>")
user.unEquip(P)
user.adjust_fire_stacks(1)
user.IgniteMob()
return
if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper
return
user.unEquip(src)
user.visible_message("<span class='danger'>[user] lights [src] ablaze with [P]!</span>", "<span class='danger'>You light [src] on fire!</span>")
fire_act()
add_fingerprint(user)
/obj/item/weapon/paperplane/throw_impact(atom/hit_atom)
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.body_parts_covered & EYES) || (H.wear_mask && H.wear_mask.body_parts_covered & EYES) || (H.glasses && H.glasses.body_parts_covered & EYES))
return
visible_message("<span class='danger'>\The [src] hits [H] in the eye!</span>")
H.eye_blurry += 10
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if(E)
E.damage += 2.5
H.emote("scream")
/obj/item/weapon/paper/AltClick(mob/living/carbon/user, obj/item/I)
if ( istype(user) )
if( (!in_range(src, user)) || user.stat || user.restrained() )
return
to_chat(user, "<span class='notice'>You fold [src] into the shape of a plane!</span>")
user.unEquip(src)
I = new /obj/item/weapon/paperplane(user, src)
user.put_in_hands(I)
else
to_chat(user, "<span class='notice'> You lack the dexterity to fold \the [src]. </span>")
+2 -2
View File
@@ -119,8 +119,8 @@
/obj/item/weapon/pen/reagent/paralysis/New()
..()
reagents.add_reagent("zombiepowder", 10)
reagents.add_reagent("cryptobiolin", 15)
reagents.add_reagent("zombiepowder", 5)
reagents.add_reagent("cryptobiolin", 10)
/*
* Chameleon pen
+4 -7
View File
@@ -681,13 +681,10 @@
else
flick("apc-spark", src)
if (do_after(user,6))
if(prob(50))
emagged = 1
locked = 0
to_chat(user,"<span class='notice'>You emag the APC interface.</span>")
update_icon()
else
to_chat(user,"<span class='warning'>The APC interface refused to unlock.</span>")
emagged = 1
locked = 0
to_chat(user,"<span class='notice'>You emag the APC interface.</span>")
update_icon()
return 1
/obj/machinery/power/apc/attack_hand(mob/user)
+2
View File
@@ -4,6 +4,8 @@
than the alternative."
icon_state = "gridchecker_on"
circuit = /obj/item/weapon/circuitboard/grid_checker
density = 1
anchored = 1
var/power_failing = FALSE // Turns to TRUE when the grid check event is fired by the Game Master, or perhaps a cheeky antag.
// Wire stuff below.
var/datum/wires/grid_checker/wires
@@ -159,6 +159,34 @@
name = "ammo clip (.45 flash)"
ammo_type = /obj/item/ammo_casing/a45f
/obj/item/ammo_magazine/s45
name = "speedloader (.45)"
icon_state = "45s"
ammo_type = /obj/item/ammo_casing/a45
matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal
caliber = ".45"
max_ammo = 7
multiple_sprites = 1
/obj/item/ammo_magazine/s45/empty
initial_ammo = 0
/obj/item/ammo_magazine/s45/rubber
name = "speedloader (.45 rubber)"
ammo_type = /obj/item/ammo_casing/a45r
/obj/item/ammo_magazine/s45/practice
name = "speedloader (.45 practice)"
ammo_type = /obj/item/ammo_casing/a45p
/obj/item/ammo_magazine/s45/flash
name = "speedloader (.45 flash)"
ammo_type = /obj/item/ammo_casing/a45f
/obj/item/ammo_magazine/s45/ap
name = "speedloader (.45 AP)"
ammo_type = /obj/item/ammo_casing/a45ap
///////// 9mm /////////
/obj/item/ammo_magazine/m9mm
@@ -23,7 +23,7 @@
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/colt/detective
desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds."
desc = "A Martian recreation of an old pistol. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/m45/rubber
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
@@ -60,7 +60,8 @@
options["H&K VP"] = "VP78"
options["P08 Luger"] = "p08"
options["P08 Luger, Brown"] = "p08b"
var/choice = input(M,"What do you want the gun's sprite to be?","Resprite Gun") in options
options["Glock 37"] = "enforcer_black"
var/choice = input(M,"Choose your sprite!","Resprite Gun") in options
if(src && choice && !M.stat && in_range(M,src))
icon_state = options[choice]
unique_reskin = options[choice]
@@ -66,6 +66,58 @@
M << "You name the gun [input]. Say hello to your new friend."
return 1
/obj/item/weapon/gun/projectile/revolver/detective45
name = ".45 revolver"
desc = "A fancy replica of an old revolver, modified for .45 rounds and a seven-shot cylinder."
icon_state = "detective"
caliber = ".45"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
fire_sound = 'sound/weapons/gunshot_heavy.ogg'
ammo_type = /obj/item/ammo_casing/a45r
max_shells = 7
obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
set name = "Name Gun"
set category = "Object"
set desc = "Rename your gun. If you're the Detective."
var/mob/M = usr
if(!M.mind) return 0
var/job = M.mind.assigned_role
if(job != "Detective")
M << "<span class='notice'>You don't feel cool enough to name this gun, chump.</span>"
return 0
var/input = sanitizeSafe(input("What do you want to name the gun?", ,""), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
name = input
M << "You name the gun [input]. Say hello to your new friend."
return 1
/obj/item/weapon/gun/projectile/revolver/detective45/verb/reskin_gun()
set name = "Resprite gun"
set category = "Object"
set desc = "Click to choose a sprite for your gun."
var/mob/M = usr
var/list/options = list()
options["Colt Detective Special"] = "detective"
options["Ruger GP100"] = "GP100"
options["Colt Single Action Army"] = "detective_peacemaker"
options["Colt Single Action Army, Dark"] = "detective_peacemaker_dark"
options["H&K PT"] = "detective_panther"
options["Vintage LeMat"] = "lemat_old"
options["Webley MKVI "] = "webley"
var/choice = input(M,"Choose your sprite!","Resprite Gun") in options
if(src && choice && !M.stat && in_range(M,src))
icon_state = options[choice]
M << "Your gun is now sprited as [choice]. Say hello to your new friend."
return 1
// Blade Runner pistol.
/obj/item/weapon/gun/projectile/revolver/deckard
name = "\improper Deckard .38"
@@ -210,6 +210,7 @@
icon_state = "vial"
matter = list("glass" = 250)
volume = 30
w_class = ITEMSIZE_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
flags = OPENCONTAINER
@@ -60,7 +60,57 @@
used = !used
return
//A vial-loaded hypospray. Cartridge-based!
/obj/item/weapon/reagent_containers/hypospray/vial
name = "hypospray mkII"
desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping."
var/obj/item/weapon/reagent_containers/glass/beaker/vial/loaded_vial //Wow, what a name.
volume = 0
/obj/item/weapon/reagent_containers/hypospray/vial/New()
..()
loaded_vial = new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) //Comes with an empty vial
volume = loaded_vial.volume
reagents.maximum_volume = loaded_vial.reagents.maximum_volume
/obj/item/weapon/reagent_containers/hypospray/vial/attack_hand(mob/user as mob)
if(user.get_inactive_hand() == src)
if(loaded_vial)
reagents.trans_to_holder(loaded_vial.reagents,volume)
reagents.maximum_volume = 0
loaded_vial.update_icon()
user.put_in_hands(loaded_vial)
loaded_vial = null
user << "<span class='notice'>You remove the vial from the [src].</span>"
update_icon()
playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
return
..()
else
return ..()
/obj/item/weapon/reagent_containers/hypospray/vial/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers/glass/beaker/vial))
if(!loaded_vial)
user.visible_message("<span class='notice'>[user] begins loading [W] into \the [src].</span>","<span class='notice'>You start loading [W] into \the [src].</span>")
if(!do_after(user,30) || loaded_vial || !(W in user))
return 0
if(W.is_open_container())
W.flags ^= OPENCONTAINER
W.update_icon()
user.drop_item()
W.loc = src
loaded_vial = W
reagents.maximum_volume = loaded_vial.reagents.maximum_volume
loaded_vial.reagents.trans_to_holder(reagents,volume)
user.visible_message("<span class='notice'>[user] has loaded [W] into \the [src].</span>","<span class='notice'>You have loaded [W] into \the [src].</span>")
update_icon()
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
else
user << "<span class='notice'>\The [src] already has a vial.</span>"
else
..()
/obj/item/weapon/reagent_containers/hypospray/autoinjector
name = "autoinjector"
desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel."
@@ -76,6 +76,13 @@
..()
reagents.add_reagent("water",1000)
/obj/structure/reagent_dispensers/watertank/high/New()
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
icon_state = "watertank_high"
..()
reagents.add_reagent("water",4000)
/obj/structure/reagent_dispensers/fueltank
name = "fueltank"
desc = "A fueltank."
+6 -6
View File
@@ -405,7 +405,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
return
/obj/machinery/computer/rdconsole/proc/GetResearchLevelsInfo()
var/dat
var/list/dat = list()
dat += "<UL>"
for(var/datum/tech/T in files.known_tech)
if(T.level < 1)
@@ -416,23 +416,23 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<LI>Level: [T.level]"
dat += "<LI>Summary: [T.desc]"
dat += "</UL>"
return dat
return dat.Join()
/obj/machinery/computer/rdconsole/proc/GetResearchListInfo()
var/dat
var/list/dat = list()
dat += "<UL>"
for(var/datum/design/D in files.known_designs)
if(D.build_path)
dat += "<LI><B>[D.name]</B>: [D.desc]"
dat += "</UL>"
return dat
return dat.Join()
/obj/machinery/computer/rdconsole/attack_hand(mob/user as mob)
if(stat & (BROKEN|NOPOWER))
return
user.set_machine(src)
var/dat = ""
var/list/dat = list()
files.RefreshResearch()
switch(screen) //A quick check to make sure you get the right screen when a device is disconnected.
if(2 to 2.9)
@@ -774,7 +774,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "List of Researched Technologies and Designs:"
dat += GetResearchListInfo()
user << browse("<TITLE>Research and Development Console</TITLE><HR>[dat]", "window=rdconsole;size=850x600")
user << browse("<TITLE>Research and Development Console</TITLE><HR>[dat.Join()]", "window=rdconsole;size=850x600")
onclose(user, "rdconsole")
/obj/machinery/computer/rdconsole/robotics
+7 -1
View File
@@ -4,7 +4,7 @@
/obj/machinery/shield_capacitor
name = "shield capacitor"
desc = "Machine that charges a shield generator."
desc = "A machine that charges a shield generator."
icon = 'icons/obj/machines/shielding.dmi'
icon_state = "capacitor"
var/active = 0
@@ -19,6 +19,12 @@
var/charge_rate = 100000 //100 kW
var/obj/machinery/shield_gen/owned_gen
/obj/machinery/shield_capacitor/advanced
name = "advanced shield capacitor"
desc = "A machine that charges a shield generator. This version can store, input, and output more electricity."
max_charge = 12e6
max_charge_rate = 600000
/obj/machinery/shield_capacitor/emag_act(var/remaining_charges, var/mob/user)
if(prob(75))
src.locked = !src.locked
+12 -4
View File
@@ -1,11 +1,11 @@
/obj/machinery/shield_gen
name = "bubble shield generator"
desc = "Machine that generates an impenetrable field of energy when activated."
desc = "A machine that generates a field of energy optimized for blocking meteorites when activated."
icon = 'icons/obj/machines/shielding.dmi'
icon_state = "generator0"
var/active = 0
var/field_radius = 3
var/max_field_radius = 100
var/max_field_radius = 150
var/list/field = list()
density = 1
var/locked = 0
@@ -20,10 +20,15 @@
var/target_field_strength = 10
var/max_field_strength = 10
var/time_since_fail = 100
var/energy_conversion_rate = 0.0002 //how many renwicks per watt?
var/energy_conversion_rate = 0.0002 //how many renwicks per watt? Higher numbers equals more effiency.
var/z_range = 0 // How far 'up and or down' to extend the shield to, in z-levels. Only works on MultiZ supported z-levels.
use_power = 0 //doesn't use APC power
/obj/machinery/shield_gen/advanced
name = "advanced bubble shield generator"
desc = "A machine that generates a field of energy optimized for blocking meteorites when activated. This version comes with a more efficent shield matrix."
energy_conversion_rate = 0.0004
/obj/machinery/shield_gen/New()
spawn(1 SECOND)
if(anchored)
@@ -259,11 +264,14 @@
/obj/machinery/shield_gen/update_icon()
if(stat & BROKEN)
icon_state = "broke"
set_light(0)
else
if (src.active)
icon_state = "generator1"
set_light(4, 2, "#00CCFF")
else
icon_state = "generator0"
set_light(0)
//grab the border tiles in a circle around this machine
/obj/machinery/shield_gen/proc/get_shielded_turfs()
@@ -315,4 +323,4 @@
T = locate(gen_turf.x + field_radius, gen_turf.y + y_offset, gen_turf.z)
if (T) out += T
return out
return out
@@ -7,8 +7,11 @@
/turf/space,
/turf/simulated/floor/outdoors,
)
/obj/machinery/shield_gen/external/New()
..()
/obj/machinery/shield_gen/external/advanced
name = "advanced hull shield generator"
desc = "A machine that generates a field of energy optimized for blocking meteorites when activated. This version comes with a more efficent shield matrix."
energy_conversion_rate = 0.0004
//Search for space turfs within range that are adjacent to a simulated turf.
/obj/machinery/shield_gen/external/get_shielded_turfs_on_z_level(var/turf/gen_turf)