mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-23 21:27:01 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into radiation_tweaks
# Conflicts: # code/game/objects/items/devices/defib.dm
This commit is contained in:
@@ -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>"
|
||||
@@ -1482,7 +1467,7 @@ datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies
|
||||
|
||||
|
||||
|
||||
if(destination.recievefax(P))
|
||||
if(destination.receivefax(P))
|
||||
src.owner << "<span class='notice'>Message reply to transmitted successfully.</span>"
|
||||
if(P.sender) // sent as a reply
|
||||
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>"}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -209,3 +209,26 @@
|
||||
var/obj/item/clothing/suit/sweater_type = sweater
|
||||
sweaters[initial(sweater_type.name)] = sweater_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(sweaters))
|
||||
|
||||
/datum/gear/accessory/bracelet/material
|
||||
display_name = "bracelet selection"
|
||||
description = "Choose from a number of bracelets."
|
||||
path = /obj/item/clothing/accessory/bracelet
|
||||
cost = 1
|
||||
|
||||
/datum/gear/accessory/bracelet/material/New()
|
||||
..()
|
||||
var/bracelettype = list()
|
||||
bracelettype["bracelet, steel"] = /obj/item/clothing/accessory/bracelet/material/steel
|
||||
bracelettype["bracelet, iron"] = /obj/item/clothing/accessory/bracelet/material/iron
|
||||
bracelettype["bracelet, silver"] = /obj/item/clothing/accessory/bracelet/material/silver
|
||||
bracelettype["bracelet, gold"] = /obj/item/clothing/accessory/bracelet/material/gold
|
||||
bracelettype["bracelet, platinum"] = /obj/item/clothing/accessory/bracelet/material/platinum
|
||||
bracelettype["bracelet, glass"] = /obj/item/clothing/accessory/bracelet/material/glass
|
||||
bracelettype["bracelet, wood"] = /obj/item/clothing/accessory/bracelet/material/wood
|
||||
bracelettype["bracelet, plastic"] = /obj/item/clothing/accessory/bracelet/material/plastic
|
||||
gear_tweaks += new/datum/gear_tweak/path(bracelettype)
|
||||
|
||||
/datum/gear/accessory/bracelet/friendship
|
||||
display_name = "friendship bracelet"
|
||||
path = /obj/item/clothing/accessory/bracelet/friendship
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -109,6 +109,17 @@
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.5
|
||||
|
||||
/obj/item/clothing/head/helmet/alien
|
||||
name = "alien helmet"
|
||||
desc = "It's quite larger than your head, but it might still protect it."
|
||||
icon_state = "alienhelmet"
|
||||
siemens_coefficient = 0.4
|
||||
armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 0, rad = 40)
|
||||
|
||||
/obj/item/clothing/head/helmet/alien/tank
|
||||
name = "alien warhelm"
|
||||
armor = list(melee = 70, bullet = 70, laser = 70, energy = 70, bomb = 70, bio = 0, rad = 40)
|
||||
|
||||
/obj/item/clothing/head/helmet/thunderdome
|
||||
name = "\improper Thunderdome helmet"
|
||||
desc = "<i>'Let the battle commence!'</i>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -67,6 +67,15 @@
|
||||
icon_state = "swat"
|
||||
siemens_coefficient = 0.7
|
||||
|
||||
/obj/item/clothing/mask/gas/explorer
|
||||
name = "explorer gas mask"
|
||||
desc = "A military-grade gas mask that can be connected to an air supply."
|
||||
icon_state = "explorer"
|
||||
item_state_slots = list(slot_r_hand_str = "gas", slot_l_hand_str = "gas")
|
||||
armor = list(melee = 10, bullet = 5, laser = 5,energy = 5, bomb = 0, bio = 50, rad = 0)
|
||||
body_parts_covered = HEAD|FACE|EYES
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat
|
||||
name = "clown wig and mask"
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without their wig and mask."
|
||||
|
||||
@@ -96,6 +96,12 @@
|
||||
desc = "A pair of winter boots. These ones are lined with brown fur, and their trim is ambrosia green"
|
||||
icon_state = "winterboots_hydro"
|
||||
|
||||
/obj/item/clothing/shoes/boots/winter/explorer
|
||||
name = "explorer winter boots"
|
||||
desc = "Steel-toed winter boots for mining or exploration in hazardous environments. Very good at keeping toes warm and uncrushed."
|
||||
icon_state = "explorer"
|
||||
armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/shoes/boots/tactical
|
||||
name = "tactical boots"
|
||||
desc = "Tan boots with extra padding and armor."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -37,8 +37,8 @@
|
||||
|
||||
var/mob/living/carbon/human/H = holder.wearer
|
||||
|
||||
H << "<font color='blue'><b>You are now invisible to normal detection.</b></font>"
|
||||
H.invisibility = INVISIBILITY_LEVEL_TWO
|
||||
to_chat(H, "<font color='blue'><b>You are now nearly invisible to normal detection.</b></font>")
|
||||
H.alpha = 5
|
||||
|
||||
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
|
||||
|
||||
@@ -51,11 +51,11 @@
|
||||
|
||||
var/mob/living/carbon/human/H = holder.wearer
|
||||
|
||||
H << "<span class='danger'>You are now visible.</span>"
|
||||
H.invisibility = 0
|
||||
to_chat(H, "<span class='danger'>You are now visible.</span>")
|
||||
|
||||
anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir)
|
||||
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
|
||||
H.alpha = initial(H.alpha)
|
||||
|
||||
for(var/mob/O in oviewers(H))
|
||||
O.show_message("[H.name] appears from thin air!",1)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
item_state = "tesh_cloak_by"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_green
|
||||
name = "black and Green cloak"
|
||||
name = "black and green cloak"
|
||||
icon_state = "tesh_cloak_bgr"
|
||||
item_state = "tesh_cloak_bgr"
|
||||
|
||||
@@ -115,8 +115,8 @@
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/blue_grey
|
||||
name = "blue and grey cloak"
|
||||
icon_state = "tesh_cloak_blg"
|
||||
item_state = "tesh_cloak_blg"
|
||||
icon_state = "tesh_cloak_blug"
|
||||
item_state = "tesh_cloak_blug"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/purple_grey
|
||||
name = "purple and grey cloak"
|
||||
@@ -124,11 +124,11 @@
|
||||
item_state = "tesh_cloak_pg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/pink_grey
|
||||
name = "black and orange cloak"
|
||||
name = "pink and grey cloak"
|
||||
icon_state = "tesh_cloak_pig"
|
||||
item_state = "tesh_cloak_pig"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/brown_grey
|
||||
name = "purple and grey cloak"
|
||||
name = "brown and grey cloak"
|
||||
icon_state = "tesh_cloak_brg"
|
||||
item_state = "tesh_cloak_brg"
|
||||
@@ -210,6 +210,36 @@
|
||||
icon_state = "reactiveoff"
|
||||
..()
|
||||
|
||||
// Alien armor has a chance to completely block attacks.
|
||||
/obj/item/clothing/suit/armor/alien
|
||||
name = "alien enhancement vest"
|
||||
desc = "It's a strange piece of what appears to be armor. It looks very light and agile. Strangely enough it seems to have been designed for a humanoid shape."
|
||||
description_info = "It has a 20% chance to completely nullify an incoming attack, and the wearer moves slightly faster."
|
||||
icon_state = "alien_speed"
|
||||
blood_overlay_type = "armor"
|
||||
item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor")
|
||||
slowdown = -1
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 0, rad = 40)
|
||||
siemens_coefficient = 0.4
|
||||
var/block_chance = 20
|
||||
|
||||
/obj/item/clothing/suit/armor/alien/tank
|
||||
name = "alien protection suit"
|
||||
desc = "It's really resilient yet lightweight, so it's probably meant to be armor. Strangely enough it seems to have been designed for a humanoid shape."
|
||||
description_info = "It has a 40% chance to completely nullify an incoming attack."
|
||||
icon_state = "alien_tank"
|
||||
slowdown = 0
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
armor = list(melee = 70, bullet = 70, laser = 70, energy = 70, bomb = 70, bio = 0, rad = 40)
|
||||
block_chance = 40
|
||||
|
||||
/obj/item/clothing/suit/armor/alien/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(prob(block_chance))
|
||||
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Non-hardsuit ERT armor.
|
||||
/obj/item/clothing/suit/armor/vest/ert
|
||||
name = "emergency response team armor"
|
||||
|
||||
@@ -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
|
||||
/*
|
||||
@@ -768,6 +770,42 @@ obj/item/clothing/suit/storage/toggle/peacoat
|
||||
name = "mining winter hood"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/explorer
|
||||
name = "explorer suit"
|
||||
desc = "An armoured suit for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
item_state = "explorer"
|
||||
flags = THICKMATERIAL
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
hooded = TRUE
|
||||
hoodtype = /obj/item/clothing/head/explorer
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50) // Inferior to sec vests in bullet/laser but better for environmental protection.
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/gun,
|
||||
/obj/item/ammo_magazine,
|
||||
/obj/item/weapon/melee,
|
||||
/obj/item/weapon/material/knife,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/weapon/pickaxe
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/explorer
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
flags = THICKMATERIAL
|
||||
flags_inv = HIDEEARS | BLOCKHAIR
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50)
|
||||
|
||||
/obj/item/clothing/suit/varsity
|
||||
name = "black varsity jacket"
|
||||
desc = "A favorite of jocks everywhere from Sol to Nyx."
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
/obj/item/clothing/suit/storage/hooded/proc/RemoveHood()
|
||||
icon_state = "[initial(icon_state)]"
|
||||
suittoggled = 0
|
||||
hood.canremove = TRUE // This shouldn't matter anyways but just incase.
|
||||
if(ishuman(hood.loc))
|
||||
var/mob/living/carbon/H = hood.loc
|
||||
H.unEquip(hood, 1)
|
||||
@@ -53,6 +54,7 @@
|
||||
else
|
||||
H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
|
||||
suittoggled = 1
|
||||
hood.canremove = FALSE
|
||||
icon_state = "[initial(icon_state)]_t"
|
||||
H.update_inv_wear_suit()
|
||||
else
|
||||
|
||||
@@ -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
|
||||
@@ -234,6 +244,14 @@
|
||||
name = "medal of exceptional heroism"
|
||||
desc = "An extremely rare golden medal awarded only by high ranking officials. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but distinguished veteran staff."
|
||||
|
||||
// Base type for 'medals' found in a "dungeon" submap, as a sort of trophy to celebrate the player's conquest.
|
||||
/obj/item/clothing/accessory/medal/dungeon
|
||||
|
||||
/obj/item/clothing/accessory/medal/dungeon/alien_ufo
|
||||
name = "alien captain's medal"
|
||||
desc = "It vaguely like a star. It looks like something an alien captain might've worn. Probably."
|
||||
icon_state = "alien_medal"
|
||||
|
||||
//Scarves
|
||||
|
||||
/obj/item/clothing/accessory/scarf
|
||||
@@ -292,3 +310,81 @@
|
||||
/obj/item/clothing/accessory/scarf/stripedblue
|
||||
name = "striped blue scarf"
|
||||
icon_state = "stripedbluescarf"
|
||||
|
||||
//bracelets
|
||||
|
||||
/obj/item/clothing/accessory/bracelet
|
||||
name = "bracelet"
|
||||
desc = "A simple silver bracelet with a clasp."
|
||||
icon = 'icons/obj/clothing/ties.dmi'
|
||||
icon_state = "bracelet"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_TIE
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/friendship
|
||||
name = "friendship bracelet"
|
||||
desc = "A beautiful friendship bracelet in all the colors of the rainbow."
|
||||
icon_state = "friendbracelet"
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/friendship/verb/dedicate_bracelet()
|
||||
set name = "Dedicate Bracelet"
|
||||
set category = "Object"
|
||||
set desc = "Dedicate your friendship bracelet to a special someone."
|
||||
var/mob/M = usr
|
||||
if(!M.mind)
|
||||
return 0
|
||||
|
||||
var/input = sanitizeSafe(input("Who do you want to dedicate the bracelet to?", ,""), MAX_NAME_LEN)
|
||||
|
||||
if(src && input && !M.stat && in_range(M,src))
|
||||
desc = "A beautiful friendship bracelet in all the colors of the rainbow. It's dedicated to [input]."
|
||||
to_chat(M, "You dedicate the bracelet to [input], remembering the times you've had together.")
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material
|
||||
icon_state = "materialbracelet"
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/New(var/newloc, var/new_material)
|
||||
..(newloc)
|
||||
if(!new_material)
|
||||
new_material = DEFAULT_WALL_MATERIAL
|
||||
material = get_material_by_name(new_material)
|
||||
if(!istype(material))
|
||||
qdel(src)
|
||||
return
|
||||
name = "[material.display_name] bracelet"
|
||||
desc = "A bracelet made from [material.display_name]."
|
||||
color = material.icon_colour
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/get_material()
|
||||
return material
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/wood/New(var/newloc)
|
||||
..(newloc, "wood")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/plastic/New(var/newloc)
|
||||
..(newloc, "plastic")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/iron/New(var/newloc)
|
||||
..(newloc, "iron")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/steel/New(var/newloc)
|
||||
..(newloc, "steel")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/silver/New(var/newloc)
|
||||
..(newloc, "silver")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/gold/New(var/newloc)
|
||||
..(newloc, "gold")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/platinum/New(var/newloc)
|
||||
..(newloc, "platinum")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/phoron/New(var/newloc)
|
||||
..(newloc, "phoron")
|
||||
|
||||
/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc)
|
||||
..(newloc, "glass")
|
||||
|
||||
..()
|
||||
@@ -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
|
||||
@@ -809,3 +812,8 @@
|
||||
desc = "A fluffy robe to keep you from showing off to the world."
|
||||
icon_state = "bathrobe"
|
||||
worn_state = "bathrobe"
|
||||
|
||||
/obj/item/clothing/under/explorer
|
||||
desc = "A green uniform for operating in hazardous environments."
|
||||
name = "explorer's jumpsuit"
|
||||
icon_state = "explorer"
|
||||
@@ -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
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
item_state = "tesh_uniform_by"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_green
|
||||
name = "black and Green undercoat"
|
||||
name = "black and green undercoat"
|
||||
icon_state = "tesh_uniform_bgr"
|
||||
item_state = "tesh_uniform_bgr"
|
||||
|
||||
@@ -148,8 +148,8 @@
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/blue_grey
|
||||
name = "blue and grey undercoat"
|
||||
icon_state = "tesh_uniform_blg"
|
||||
item_state = "tesh_uniform_blg"
|
||||
icon_state = "tesh_uniform_blug"
|
||||
item_state = "tesh_uniform_blug"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/purple_grey
|
||||
name = "purple and grey undercoat"
|
||||
@@ -157,11 +157,11 @@
|
||||
item_state = "tesh_uniform_pg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/pink_grey
|
||||
name = "black and orange undercoat"
|
||||
name = "pink and grey undercoat"
|
||||
icon_state = "tesh_uniform_pig"
|
||||
item_state = "tesh_uniform_pig"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/brown_grey
|
||||
name = "purple and grey undercoat"
|
||||
name = "brown and grey undercoat"
|
||||
icon_state = "tesh_uniform_brg"
|
||||
item_state = "tesh_uniform_brg"
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,12 @@ var/list/global/map_templates = list()
|
||||
var/mappath = null
|
||||
var/loaded = 0 // Times loaded this round
|
||||
var/annihilate = FALSE // If true, all (movable) atoms at the location where the map is loaded will be deleted before the map is loaded in.
|
||||
|
||||
var/cost = null // The map generator has a set 'budget' it spends to place down different submaps. It will pick available submaps randomly until \
|
||||
it runs out. The cost of a submap should roughly corrispond with several factors such as size, loot, difficulty, desired scarcity, etc. \
|
||||
Set to -1 to force the submap to always be made.
|
||||
var/allow_duplicates = FALSE // If false, only one map template will be spawned by the game. Doesn't affect admins spawning then manually.
|
||||
|
||||
var/static/dmm_suite/maploader = new
|
||||
|
||||
/datum/map_template/New(path = null, rename = null)
|
||||
@@ -111,7 +117,7 @@ var/list/global/map_templates = list()
|
||||
log_game("Z-level [name] loaded at at [x],[y],[world.maxz]")
|
||||
return TRUE
|
||||
|
||||
/datum/map_template/proc/load(turf/T, centered = FALSE)
|
||||
/datum/map_template/proc/load(turf/T, centered = FALSE, dont_init = FALSE)
|
||||
var/old_T = T
|
||||
if(centered)
|
||||
T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z)
|
||||
@@ -133,7 +139,8 @@ var/list/global/map_templates = list()
|
||||
// repopulate_sorted_areas()
|
||||
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
if(!dont_init)
|
||||
initTemplateBounds(bounds)
|
||||
|
||||
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
|
||||
loaded++
|
||||
@@ -163,4 +170,118 @@ var/list/global/map_templates = list()
|
||||
//❤ - Cyberboss
|
||||
/proc/load_new_z_level(var/file, var/name)
|
||||
var/datum/map_template/template = new(file, name)
|
||||
template.load_new_z()
|
||||
template.load_new_z()
|
||||
|
||||
// Very similar to the /tg/ version.
|
||||
/proc/seed_submaps(var/list/z_levels, var/budget = 0, var/whitelist = /area/space, var/desired_map_template_type = null)
|
||||
set background = TRUE
|
||||
|
||||
if(!z_levels || !z_levels.len)
|
||||
admin_notice("seed_submaps() was not given any Z-levels.", R_DEBUG)
|
||||
return
|
||||
|
||||
for(var/zl in z_levels)
|
||||
var/turf/T = locate(1, 1, zl)
|
||||
if(!T)
|
||||
admin_notice("Z level [zl] does not exist - Not generating submaps", R_DEBUG)
|
||||
return
|
||||
|
||||
var/overall_sanity = 100 // If the proc fails to place a submap more than this, the whole thing aborts.
|
||||
var/list/potential_submaps = list() // Submaps we may or may not place.
|
||||
var/list/priority_submaps = list() // Submaps that will always be placed.
|
||||
|
||||
// Lets go find some submaps to make.
|
||||
for(var/map in map_templates)
|
||||
var/datum/map_template/MT = map_templates[map]
|
||||
if(!MT.allow_duplicates && MT.loaded > 0) // This probably won't be an issue but we might as well.
|
||||
continue
|
||||
if(!istype(MT, desired_map_template_type)) // Not the type wanted.
|
||||
continue
|
||||
if(MT.cost && MT.cost < 0) // Negative costs always get spawned.
|
||||
priority_submaps += MT
|
||||
else
|
||||
potential_submaps += MT
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
var/list/loaded_submap_names = list()
|
||||
|
||||
// Now lets start choosing some.
|
||||
while(budget > 0 && overall_sanity > 0)
|
||||
overall_sanity--
|
||||
var/datum/map_template/chosen_template = null
|
||||
|
||||
if(potential_submaps.len)
|
||||
if(priority_submaps.len) // Do these first.
|
||||
chosen_template = pick(priority_submaps)
|
||||
else
|
||||
chosen_template = pick(potential_submaps)
|
||||
|
||||
else // We're out of submaps.
|
||||
admin_notice("Submap loader had no submaps to pick from with [budget] left to spend.", R_DEBUG)
|
||||
break
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
// Can we afford it?
|
||||
if(chosen_template.cost > budget)
|
||||
continue
|
||||
|
||||
// If so, try to place it.
|
||||
var/specific_sanity = 100 // A hundred chances to place the chosen submap.
|
||||
while(specific_sanity > 0)
|
||||
specific_sanity--
|
||||
var/width_border = TRANSITIONEDGE + SUBMAP_MAP_EDGE_PAD + round(chosen_template.width / 2)
|
||||
var/height_border = TRANSITIONEDGE + SUBMAP_MAP_EDGE_PAD + round(chosen_template.height / 2)
|
||||
var/z_level = pick(z_levels)
|
||||
var/turf/T = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z_level)
|
||||
var/valid = TRUE
|
||||
|
||||
for(var/turf/check in chosen_template.get_affected_turfs(T,1))
|
||||
var/area/new_area = get_area(check)
|
||||
if(!(istype(new_area, whitelist)))
|
||||
valid = FALSE // Probably overlapping something important.
|
||||
// world << "Invalid due to overlapping with area [new_area.type], when wanting area [whitelist]."
|
||||
break
|
||||
CHECK_TICK
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
if(!valid)
|
||||
continue
|
||||
|
||||
admin_notice("Submap \"[chosen_template.name]\" placed at ([T.x], [T.y], [T.z])", R_DEBUG)
|
||||
|
||||
// Do loading here.
|
||||
chosen_template.load(T, centered = TRUE, dont_init = TRUE) // This is run before the main map's initialization routine, so that can initilize our submaps for us instead.
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
if(loaded_submap_names[chosen_template.name])
|
||||
loaded_submap_names[chosen_template.name] += 1
|
||||
else
|
||||
loaded_submap_names[chosen_template.name] = 1
|
||||
|
||||
if(chosen_template.cost >= 0)
|
||||
budget -= chosen_template.cost
|
||||
|
||||
if(chosen_template in priority_submaps) // Always remove priority submaps.
|
||||
priority_submaps -= chosen_template
|
||||
else if(!chosen_template.allow_duplicates)
|
||||
potential_submaps -= chosen_template
|
||||
|
||||
break // Load the next submap.
|
||||
|
||||
var/list/pretty_submap_list = list()
|
||||
for(var/submap_name in loaded_submap_names)
|
||||
var/count = loaded_submap_names[submap_name]
|
||||
if(count > 1)
|
||||
pretty_submap_list += "[count] <b>[submap_name]</b>"
|
||||
else
|
||||
pretty_submap_list += "<b>[submap_name]</b>"
|
||||
|
||||
if(!overall_sanity)
|
||||
admin_notice("Submap loader gave up with [budget] left to spend.", R_DEBUG)
|
||||
else
|
||||
admin_notice("Submaps loaded.", R_DEBUG)
|
||||
admin_notice("Loaded: [english_list(pretty_submap_list)]", R_DEBUG)
|
||||
@@ -13,7 +13,7 @@
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
if(integrity>=50)
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
@@ -642,6 +642,19 @@ var/list/name_to_material
|
||||
display_name = "elevator panelling"
|
||||
icon_colour = "#666666"
|
||||
|
||||
// Ditto.
|
||||
/material/alienalloy/dungeonium
|
||||
name = "dungeonium"
|
||||
display_name = "ultra-durable"
|
||||
icon_base = "dungeon"
|
||||
icon_colour = "#FFFFFF"
|
||||
|
||||
/material/alienalloy/alium
|
||||
name = "alium"
|
||||
display_name = "alien"
|
||||
icon_base = "alien"
|
||||
icon_colour = "#FFFFFF"
|
||||
|
||||
/material/resin
|
||||
name = "resin"
|
||||
icon_colour = "#35343a"
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -37,4 +37,12 @@
|
||||
return
|
||||
hat = new_hat
|
||||
new_hat.loc = src
|
||||
update_icons()
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/handle_npc(var/mob/living/carbon/alien/diona/D)
|
||||
if(D.stat != CONSCIOUS)
|
||||
return
|
||||
if(prob(33) && D.canmove && isturf(D.loc) && !D.pulledby) //won't move if being pulled
|
||||
step(D, pick(cardinal))
|
||||
if(prob(1))
|
||||
D.emote(pick("scratch","jump","chirp","roll"))
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
/mob/living/carbon/alien/diona/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||
if(hat)
|
||||
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
|
||||
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
|
||||
return
|
||||
user.unEquip(W)
|
||||
wear_hat(W)
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||
return
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -14,4 +14,8 @@
|
||||
adjustBruteLoss(-1)
|
||||
adjustFireLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
|
||||
|
||||
if(!client)
|
||||
handle_npc(src)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue)
|
||||
if(red == r_eyes && green == g_eyes && blue == b_eyes)
|
||||
if(red == r_hair && green == g_hair && blue == b_hair)
|
||||
return
|
||||
|
||||
r_hair = red
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
var/spit_name = null //String
|
||||
var/last_spit = 0 //Timestamp.
|
||||
|
||||
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
|
||||
|
||||
if(!dna)
|
||||
@@ -36,8 +38,12 @@
|
||||
nutrition = rand(200,400)
|
||||
|
||||
hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100")
|
||||
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
if(isSynthetic())
|
||||
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudrobo")
|
||||
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudrobo")
|
||||
else
|
||||
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[ID_HUD] = new /image/hud_overlay(using_map.id_hud_icons, src, "hudunknown")
|
||||
hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
@@ -318,15 +324,13 @@
|
||||
|
||||
//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) )
|
||||
return get_id_name("Unknown") //Likewise for hats
|
||||
var/face_name = get_face_name()
|
||||
var/id_name = get_id_name("")
|
||||
if(id_name && (id_name != face_name))
|
||||
if((face_name == "Unknown") && id_name && (id_name != face_name))
|
||||
return "[face_name] (as [id_name])"
|
||||
return face_name
|
||||
|
||||
@@ -1136,6 +1140,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 +1530,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
|
||||
@@ -1582,7 +1582,9 @@
|
||||
|
||||
if (BITTEST(hud_updateflag, LIFE_HUD))
|
||||
var/image/holder = hud_list[LIFE_HUD]
|
||||
if(stat == DEAD)
|
||||
if(isSynthetic())
|
||||
holder.icon_state = "hudrobo"
|
||||
else if(stat == DEAD)
|
||||
holder.icon_state = "huddead"
|
||||
else
|
||||
holder.icon_state = "hudhealthy"
|
||||
@@ -1597,7 +1599,9 @@
|
||||
|
||||
var/image/holder = hud_list[STATUS_HUD]
|
||||
var/image/holder2 = hud_list[STATUS_HUD_OOC]
|
||||
if(stat == DEAD)
|
||||
if (isSynthetic())
|
||||
holder.icon_state = "hudrobo"
|
||||
else if(stat == DEAD)
|
||||
holder.icon_state = "huddead"
|
||||
holder2.icon_state = "huddead"
|
||||
else if(foundVirus)
|
||||
|
||||
@@ -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>")
|
||||
@@ -190,3 +197,30 @@ var/list/wrapped_species_by_ref = list()
|
||||
E.sync_colour_to_human(src)
|
||||
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors()
|
||||
|
||||
set name = "Select Hair Colors"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
var/new_hair = input("Please select a new hair color.", "Hair Colour") as color
|
||||
if(!new_hair)
|
||||
return
|
||||
shapeshifter_set_hair_color(new_hair)
|
||||
var/new_fhair = input("Please select a new facial hair color.", "Facial Hair Color") as color
|
||||
if(!new_fhair)
|
||||
return
|
||||
shapeshifter_set_facial_color(new_fhair)
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_set_hair_color(var/new_hair)
|
||||
|
||||
change_hair_color(hex2num(copytext(new_hair, 2, 4)), hex2num(copytext(new_hair, 4, 6)), hex2num(copytext(new_hair, 6, 8)))
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_set_facial_color(var/new_fhair)
|
||||
|
||||
change_facial_hair_color(hex2num(copytext(new_fhair, 2, 4)), hex2num(copytext(new_fhair, 4, 6)), hex2num(copytext(new_fhair, 6, 8)))
|
||||
@@ -81,12 +81,12 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_shape,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_colour,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_gender,
|
||||
/mob/living/carbon/human/proc/regenerate
|
||||
)
|
||||
|
||||
valid_transform_species = list("Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
|
||||
monochromatic = 1
|
||||
valid_transform_species = list("Human", "Vatborn", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1002,3 +1002,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
|
||||
@@ -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
|
||||
|
||||
@@ -430,7 +430,7 @@
|
||||
user << "<span class='notice'>You add the access from the [W] to [src].</span>"
|
||||
return
|
||||
if("Remove Access")
|
||||
idcard.access = null
|
||||
idcard.access = list()
|
||||
user << "<span class='notice'>You remove the access from [src].</span>"
|
||||
return
|
||||
if("Cancel")
|
||||
@@ -442,7 +442,7 @@
|
||||
/mob/living/silicon/pai/verb/allowmodification()
|
||||
set name = "Change Access Modifcation Permission"
|
||||
set category = "pAI Commands"
|
||||
desc = "Allows people to modify your access or block people from modifying your access."
|
||||
set desc = "Allows people to modify your access or block people from modifying your access."
|
||||
|
||||
if(idaccessible == 0)
|
||||
idaccessible = 1
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
/mob/living/simple_animal/hostile/giant_spider/proc/remove_eyes()
|
||||
overlays -= eye_layer
|
||||
|
||||
/*
|
||||
Nurse Family
|
||||
*/
|
||||
|
||||
//nursemaids - these create webs and eggs
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse
|
||||
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
|
||||
@@ -95,7 +99,105 @@
|
||||
old_x = -16
|
||||
old_y = -16
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/webslinger
|
||||
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
|
||||
icon_state = "webslinger"
|
||||
icon_living = "webslinger"
|
||||
icon_dead = "webslinger_dead"
|
||||
|
||||
maxHealth = 90
|
||||
health = 90
|
||||
|
||||
projectilesound = 'sound/weapons/thudswoosh.ogg'
|
||||
projectiletype = /obj/item/projectile/bola
|
||||
ranged = 1
|
||||
firing_lines = 1
|
||||
cooperative = 1
|
||||
shoot_range = 5
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
poison_per_bite = 2
|
||||
poison_type = "psilocybin"
|
||||
|
||||
spattack_prob = 15
|
||||
spattack_min_range = 0
|
||||
spattack_max_range = 5
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/webslinger/AttackTarget() //One day.
|
||||
var/mob/living/carbon/human/victim = null //Webslinger needs to know if its target is human later.
|
||||
if(ishuman(target_mob))
|
||||
victim = target_mob
|
||||
if(!victim.legcuffed)
|
||||
projectiletype = /obj/item/projectile/bola
|
||||
shoot_range = 7
|
||||
else
|
||||
projectiletype = /obj/item/projectile/webball
|
||||
shoot_range = 5
|
||||
else
|
||||
projectiletype = /obj/item/projectile/webball
|
||||
shoot_range = 5
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/carrier
|
||||
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
|
||||
icon_state = "carrier"
|
||||
icon_living = "carrier"
|
||||
icon_dead = "carrier_dead"
|
||||
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 20
|
||||
|
||||
poison_per_bite = 3
|
||||
poison_type = "chloralhydrate"
|
||||
|
||||
var/spiderling_count = 0
|
||||
var/spiderling_type = /obj/effect/spider/spiderling
|
||||
var/swarmling_type = /mob/living/simple_animal/hostile/giant_spider/hunter
|
||||
var/swarmling_faction = "spiders"
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/carrier/New()
|
||||
spiderling_count = rand(5,10)
|
||||
adjust_scale(1.2)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/carrier/death()
|
||||
visible_message("<span class='notice'>\The [src]'s abdomen splits as it rolls over, spiderlings crawling from the wound.</span>")
|
||||
spawn(1)
|
||||
for(var/I = 1 to spiderling_count)
|
||||
if(prob(10) && src)
|
||||
var/mob/living/simple_animal/hostile/giant_spider/swarmling = new swarmling_type(src.loc)
|
||||
var/swarm_health = Floor(swarmling.maxHealth * 0.4)
|
||||
var/swarm_dam_lower = Floor(melee_damage_lower * 0.4)
|
||||
var/swarm_dam_upper = Floor(melee_damage_upper * 0.4)
|
||||
swarmling.name = "spiderling"
|
||||
swarmling.maxHealth = swarm_health
|
||||
swarmling.health = swarm_health
|
||||
swarmling.melee_damage_lower = swarm_dam_lower
|
||||
swarmling.melee_damage_upper = swarm_dam_upper
|
||||
swarmling.faction = swarmling_faction
|
||||
swarmling.adjust_scale(0.75)
|
||||
else if(src)
|
||||
var/obj/effect/spider/spiderling/child = new spiderling_type(src.loc)
|
||||
child.skitter()
|
||||
else
|
||||
break
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/carrier/recursive
|
||||
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. You have a distinctly <font face='comic sans ms'>bad</font> feeling about this."
|
||||
|
||||
swarmling_type = /mob/living/simple_animal/hostile/giant_spider/carrier/recursive
|
||||
|
||||
/*
|
||||
Hunter Family
|
||||
*/
|
||||
|
||||
//hunters have the most poison and move the fastest, so they can find prey
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/hunter
|
||||
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
|
||||
icon_state = "hunter"
|
||||
@@ -111,6 +213,150 @@
|
||||
|
||||
poison_per_bite = 5
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/lurker
|
||||
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
|
||||
icon_state = "lurker"
|
||||
icon_living = "lurker"
|
||||
icon_dead = "lurker_dead"
|
||||
alpha = 45
|
||||
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
move_to_delay = 4
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 20
|
||||
|
||||
|
||||
poison_chance = 20
|
||||
poison_type = "cryptobiolin"
|
||||
poison_per_bite = 2
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/lurker/death()
|
||||
alpha = 255
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/tunneler
|
||||
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
|
||||
icon_state = "tunneler"
|
||||
icon_living = "tunneler"
|
||||
icon_dead = "tunneler_dead"
|
||||
|
||||
maxHealth = 120
|
||||
health = 120
|
||||
move_to_delay = 4
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
|
||||
poison_chance = 15
|
||||
poison_per_bite = 3
|
||||
poison_type = "serotrotium_v"
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/tunneler/death()
|
||||
spawn(1)
|
||||
for(var/I = 1 to rand(3,6))
|
||||
if(src)
|
||||
new/obj/item/weapon/ore/glass(src.loc)
|
||||
else
|
||||
break
|
||||
return ..()
|
||||
|
||||
/*
|
||||
Guard Family
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/pepper
|
||||
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
|
||||
icon_state = "pepper"
|
||||
icon_living = "pepper"
|
||||
icon_dead = "pepper_dead"
|
||||
|
||||
maxHealth = 210
|
||||
health = 210
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
|
||||
poison_chance = 20
|
||||
poison_per_bite = 5
|
||||
poison_type = "condensedcapsaicin_v"
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/pepper/New()
|
||||
adjust_scale(1.1)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/thermic
|
||||
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
|
||||
icon_state = "pit"
|
||||
icon_living = "pit"
|
||||
icon_dead = "pit_dead"
|
||||
|
||||
maxHealth = 175
|
||||
health = 175
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
|
||||
poison_chance = 30
|
||||
poison_per_bite = 1
|
||||
poison_type = "thermite_v"
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/electric
|
||||
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
|
||||
icon_state = "spark"
|
||||
icon_living = "spark"
|
||||
icon_dead = "spark_dead"
|
||||
|
||||
maxHealth = 210
|
||||
health = 210
|
||||
taser_kill = 0 //It -is- the taser.
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
|
||||
ranged = 1
|
||||
projectilesound = 'sound/weapons/taser2.ogg'
|
||||
projectiletype = /obj/item/projectile/beam/stun/weak
|
||||
firing_lines = 1
|
||||
cooperative = 1
|
||||
|
||||
poison_chance = 15
|
||||
poison_per_bite = 3
|
||||
poison_type = "stimm"
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/phorogenic
|
||||
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
|
||||
icon_state = "phoron"
|
||||
icon_living = "phoron"
|
||||
icon_dead = "phoron_dead"
|
||||
|
||||
maxHealth = 225
|
||||
health = 225
|
||||
taser_kill = 0 //You will need more than a peashooter to kill the juggernaut.
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
|
||||
poison_chance = 30
|
||||
poison_per_bite = 0.5
|
||||
poison_type = "phoron"
|
||||
|
||||
var/exploded = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/phorogenic/New()
|
||||
adjust_scale(1.25)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/phorogenic/death()
|
||||
visible_message("<span class='danger'>\The [src]'s body begins to rupture!</span>")
|
||||
spawn(rand(1,5))
|
||||
if(src && !exploded)
|
||||
visible_message("<span class='critical'>\The [src]'s body detonates!</span>")
|
||||
exploded = 1
|
||||
explosion(src.loc, 1, 2, 4, 6)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/frost
|
||||
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
|
||||
icon_state = "frost"
|
||||
@@ -126,6 +372,9 @@
|
||||
poison_per_bite = 5
|
||||
poison_type = "cryotoxin"
|
||||
|
||||
/*
|
||||
Spider Procs
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
|
||||
get_light_and_color(parent)
|
||||
@@ -167,6 +416,16 @@
|
||||
O.implants += eggs
|
||||
to_chat(H, "<font size='3'><span class='warning'>\The [src] injects something into your [O.name]!</span></font>")
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/webslinger/DoPunch(var/atom/A)
|
||||
. = ..()
|
||||
if(.) // If we succeeded in hitting.
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
var/obj/effect/spider/stickyweb/W = locate() in get_turf(L)
|
||||
if(!W && prob(75))
|
||||
visible_message("<span class='danger'>\The [src] throws a layer of web at \the [L]!</span>")
|
||||
new /obj/effect/spider/stickyweb(L.loc)
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/handle_stance()
|
||||
. = ..()
|
||||
if(ai_inactive) return
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
icon_living = "mouse_[body_color]"
|
||||
icon_dead = "mouse_[body_color]_dead"
|
||||
icon_rest = "mouse_[body_color]_sleep"
|
||||
desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
|
||||
desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
|
||||
|
||||
/mob/living/simple_animal/mouse/proc/splat()
|
||||
src.health = 0
|
||||
@@ -95,13 +95,13 @@
|
||||
if( ishuman(AM) )
|
||||
if(!stat)
|
||||
var/mob/M = AM
|
||||
M << "<font color='blue'>\icon[src] Squeek!</font>"
|
||||
M.visible_message("<font color='blue'>\icon[src] Squeek!</font>")
|
||||
M << 'sound/effects/mouse_squeak.ogg'
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/mouse/death()
|
||||
layer = MOB_LAYER
|
||||
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1)
|
||||
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 35, 1)
|
||||
if(client)
|
||||
client.time_died_as_mouse = world.time
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
@@ -501,7 +504,10 @@
|
||||
stun_effect_act(0, Proj.agony)
|
||||
|
||||
if(!Proj.nodamage)
|
||||
adjustBruteLoss(Proj.damage)
|
||||
var/true_damage = Proj.damage
|
||||
if(!Proj.SA_vulnerability || Proj.SA_vulnerability == intelligence_level)
|
||||
true_damage += Proj.SA_bonus_damage
|
||||
adjustBruteLoss(true_damage)
|
||||
|
||||
if(Proj.firer)
|
||||
react_to_attack(Proj.firer)
|
||||
@@ -1168,7 +1174,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 +1443,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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
return 0
|
||||
|
||||
/obj/item/organ/internal/appendix/process()
|
||||
..()
|
||||
|
||||
if(!inflamed || !owner)
|
||||
return
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]]"
|
||||
|
||||
@@ -279,6 +279,8 @@
|
||||
spawn(1)
|
||||
owner.update_hair()
|
||||
get_icon()
|
||||
if(vital) //This is just in case we ever add something that both a) Doesn't need a head to live, and b) Can be defibbed
|
||||
owner.can_defib = 0
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
shuttle.area_offsite = shuttle.area_station
|
||||
shuttle_controller.shuttles[shuttle_tag] = shuttle
|
||||
shuttle_controller.process_shuttles += shuttle
|
||||
testing("Exploration shuttle '[shuttle_tag]' at zlevel [z] successfully added.")
|
||||
testing("Exploration shuttle '[shuttle_tag]' at z-level [z] successfully added.")
|
||||
|
||||
//Sets destination to new sector. Can be null.
|
||||
/obj/machinery/computer/shuttle_control/explore/proc/update_destination(var/obj/effect/map/D)
|
||||
@@ -84,7 +84,7 @@
|
||||
else
|
||||
shuttle_status = "Standing-by at offsite location."
|
||||
if(WAIT_LAUNCH, FORCE_LAUNCH)
|
||||
shuttle_status = "Shuttle has recieved command and will depart shortly."
|
||||
shuttle_status = "Shuttle has received command and will depart shortly."
|
||||
if(WAIT_ARRIVE)
|
||||
shuttle_status = "Proceeding to destination."
|
||||
if(WAIT_FINISH)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
text = "<hr><font size= \"1\">"
|
||||
text += "This transmission is intended only for the addressee and may contain confidential information. Any unauthorized disclosure is strictly prohibited. <br><br>"
|
||||
text += "If this transmission is recieved in error, please notify both the sender and the office of [using_map.boss_name] Internal Affairs immediately so that corrective action may be taken."
|
||||
text += "If this transmission is received in error, please notify both the sender and the office of [using_map.boss_name] Internal Affairs immediately so that corrective action may be taken."
|
||||
text += "Failure to comply is a breach of regulation and may be prosecuted to the fullest extent of the law, where applicable."
|
||||
text += "</font>"
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
|
||||
if(copyitem)
|
||||
copyitem.loc = usr.loc
|
||||
usr.put_in_hands(copyitem)
|
||||
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>"
|
||||
to_chat(usr, "<span class='notice'>You take \the [copyitem] out of \the [src].</span>")
|
||||
copyitem = null
|
||||
|
||||
if(href_list["scan"])
|
||||
@@ -124,7 +124,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
|
||||
var/success = 0
|
||||
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
|
||||
if( F.department == destination )
|
||||
success = F.recievefax(copyitem)
|
||||
success = F.receivefax(copyitem)
|
||||
|
||||
if (success)
|
||||
visible_message("[src] beeps, \"Message transmitted successfully.\"")
|
||||
@@ -132,7 +132,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
|
||||
else
|
||||
visible_message("[src] beeps, \"Error transmitting message.\"")
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/proc/recievefax(var/obj/item/incoming)
|
||||
/obj/machinery/photocopier/faxmachine/proc/receivefax(var/obj/item/incoming)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return 0
|
||||
|
||||
@@ -164,7 +164,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
|
||||
|
||||
use_power(200)
|
||||
|
||||
//recieved copies should not use toner since it's being used by admins only.
|
||||
//received copies should not use toner since it's being used by admins only.
|
||||
var/obj/item/rcvdcopy
|
||||
if (istype(copyitem, /obj/item/weapon/paper))
|
||||
rcvdcopy = copy(copyitem, 0)
|
||||
|
||||
@@ -35,6 +35,24 @@
|
||||
var/const/signfont = "Times New Roman"
|
||||
var/const/crayonfont = "Comic Sans MS"
|
||||
|
||||
/obj/item/weapon/paper/alien
|
||||
name = "alien tablet"
|
||||
desc = "It looks highly advanced"
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "alienpaper"
|
||||
|
||||
/obj/item/weapon/paper/alien/update_icon()
|
||||
if(info)
|
||||
icon_state = "alienpaper_words"
|
||||
else
|
||||
icon_state = "alienpaper"
|
||||
|
||||
/obj/item/weapon/paper/alien/burnpaper()
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/alien/AltClick() // No airplanes for me.
|
||||
return
|
||||
|
||||
//lipstick wiping is in code/game/objects/items/weapons/cosmetics.dm!
|
||||
|
||||
/obj/item/weapon/paper/New()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -195,8 +195,8 @@ datum/weather/sif
|
||||
/datum/weather/sif/blizzard
|
||||
name = "blizzard"
|
||||
icon_state = "snowfall_heavy"
|
||||
temp_high = 233.15 // -40c
|
||||
temp_low = 213.15 // -60c
|
||||
temp_high = 243.15 // -30c
|
||||
temp_low = 233.15 // -40c
|
||||
light_modifier = 0.3
|
||||
flight_falure_modifier = 10
|
||||
transition_chances = list(
|
||||
@@ -241,7 +241,7 @@ datum/weather/sif
|
||||
name = "storm"
|
||||
icon_state = "storm"
|
||||
temp_high = 243.15 // -30c
|
||||
temp_low = 233.15 // -50c
|
||||
temp_low = 233.15 // -40c
|
||||
light_modifier = 0.3
|
||||
flight_falure_modifier = 10
|
||||
transition_chances = list(
|
||||
|
||||
@@ -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,6 +2,28 @@
|
||||
// charge from 0 to 100%
|
||||
// fits in APC to provide backup power
|
||||
|
||||
/obj/item/weapon/cell
|
||||
name = "power cell"
|
||||
desc = "A rechargable electrochemical power cell."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
item_state = "cell"
|
||||
origin_tech = list(TECH_POWER = 1)
|
||||
force = 5.0
|
||||
throwforce = 5.0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
var/charge = 0 // note %age conveted to actual charge in New
|
||||
var/maxcharge = 1000
|
||||
var/rigged = 0 // true if rigged to explode
|
||||
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
|
||||
var/self_recharge = FALSE // If true, the cell will recharge itself.
|
||||
var/charge_amount = 25 // How much power to give, if self_recharge is true. The number is in absolute cell charge, as it gets divided by CELLRATE later.
|
||||
var/last_use = 0 // A tracker for use in self-charging
|
||||
var/charge_delay = 0 // How long it takes for the cell to start recharging after last use
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
|
||||
|
||||
/obj/item/weapon/cell/New()
|
||||
..()
|
||||
charge = maxcharge
|
||||
@@ -16,7 +38,8 @@
|
||||
|
||||
/obj/item/weapon/cell/process()
|
||||
if(self_recharge)
|
||||
give(charge_amount)
|
||||
if(world.time >= last_use + charge_delay)
|
||||
give(charge_amount)
|
||||
else
|
||||
return PROCESS_KILL
|
||||
|
||||
@@ -59,6 +82,7 @@
|
||||
return 0
|
||||
var/used = min(charge, amount)
|
||||
charge -= used
|
||||
last_use = world.time
|
||||
update_icon()
|
||||
return used
|
||||
|
||||
@@ -80,6 +104,8 @@
|
||||
var/amount_used = min(maxcharge-charge,amount)
|
||||
charge += amount_used
|
||||
update_icon()
|
||||
if(loc)
|
||||
loc.update_icon()
|
||||
return amount_used
|
||||
|
||||
|
||||
@@ -112,7 +138,6 @@
|
||||
|
||||
S.reagents.clear_reagents()
|
||||
|
||||
|
||||
/obj/item/weapon/cell/proc/explode()
|
||||
var/turf/T = get_turf(src.loc)
|
||||
/*
|
||||
@@ -207,3 +232,7 @@
|
||||
return min(rand(10,20),rand(10,20))
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/cell/suicide_act(mob/user)
|
||||
viewers(user) << "<span class='danger'>\The [user] is licking the electrodes of \the [src]! It looks like \he's trying to commit suicide.</span>"
|
||||
return (FIRELOSS)
|
||||
@@ -0,0 +1,50 @@
|
||||
//currently only used by energy-type guns, that may change in the future.
|
||||
/obj/item/weapon/cell/device
|
||||
name = "device power cell"
|
||||
desc = "A small power cell designed to power handheld devices."
|
||||
icon_state = "dcell"
|
||||
item_state = "egg6"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
force = 0
|
||||
throw_speed = 5
|
||||
throw_range = 7
|
||||
maxcharge = 480
|
||||
charge_amount = 5
|
||||
matter = list("metal" = 350, "glass" = 50)
|
||||
preserve_item = 1
|
||||
|
||||
/obj/item/weapon/cell/device/weapon
|
||||
name = "weapon power cell"
|
||||
desc = "A small power cell designed to power handheld weaponry."
|
||||
icon_state = "wcell"
|
||||
maxcharge = 2400
|
||||
charge_amount = 20
|
||||
|
||||
/obj/item/weapon/cell/device/weapon/empty/initialize()
|
||||
..()
|
||||
charge = 0
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/cell/device/weapon/recharge
|
||||
name = "self-charging weapon power cell"
|
||||
desc = "A small power cell designed to power handheld weaponry. This one recharges itself."
|
||||
// icon_state = "wcell" //TODO: Different sprite
|
||||
self_recharge = TRUE
|
||||
charge_amount = 120
|
||||
charge_delay = 75
|
||||
|
||||
/obj/item/weapon/cell/device/weapon/recharge/captain
|
||||
charge_amount = 160 //Recharges a lot more quickly...
|
||||
charge_delay = 100 //... but it takes a while to get started
|
||||
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien
|
||||
name = "void cell"
|
||||
desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "cell"
|
||||
charge_amount = 120 // 5%.
|
||||
charge_delay = 50 // Every five seconds, bit faster than the default.
|
||||
origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
|
||||
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien/update_icon()
|
||||
return // No overlays please.
|
||||
@@ -0,0 +1,93 @@
|
||||
/obj/item/weapon/cell/crap
|
||||
name = "\improper rechargable AA battery"
|
||||
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
|
||||
origin_tech = list(TECH_POWER = 0)
|
||||
maxcharge = 500
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
|
||||
|
||||
/obj/item/weapon/cell/crap/empty/New()
|
||||
..()
|
||||
charge = 0
|
||||
|
||||
/obj/item/weapon/cell/secborg
|
||||
name = "security borg rechargable D battery"
|
||||
origin_tech = list(TECH_POWER = 0)
|
||||
maxcharge = 600 //600 max charge / 100 charge per shot = six shots
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
|
||||
|
||||
/obj/item/weapon/cell/secborg/empty/New()
|
||||
..()
|
||||
charge = 0
|
||||
|
||||
/obj/item/weapon/cell/apc
|
||||
name = "heavy-duty power cell"
|
||||
origin_tech = list(TECH_POWER = 1)
|
||||
maxcharge = 5000
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
|
||||
|
||||
/obj/item/weapon/cell/high
|
||||
name = "high-capacity power cell"
|
||||
origin_tech = list(TECH_POWER = 2)
|
||||
icon_state = "hcell"
|
||||
maxcharge = 10000
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
|
||||
|
||||
/obj/item/weapon/cell/high/empty/New()
|
||||
..()
|
||||
charge = 0
|
||||
|
||||
/obj/item/weapon/cell/super
|
||||
name = "super-capacity power cell"
|
||||
origin_tech = list(TECH_POWER = 5)
|
||||
icon_state = "scell"
|
||||
maxcharge = 20000
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
|
||||
|
||||
/obj/item/weapon/cell/super/empty/New()
|
||||
..()
|
||||
charge = 0
|
||||
|
||||
/obj/item/weapon/cell/hyper
|
||||
name = "hyper-capacity power cell"
|
||||
origin_tech = list(TECH_POWER = 6)
|
||||
icon_state = "hpcell"
|
||||
maxcharge = 30000
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
|
||||
|
||||
/obj/item/weapon/cell/hyper/empty/New()
|
||||
..()
|
||||
charge = 0
|
||||
|
||||
/obj/item/weapon/cell/infinite
|
||||
name = "infinite-capacity power cell!"
|
||||
icon_state = "icell"
|
||||
origin_tech = null
|
||||
maxcharge = 30000 //determines how badly mobs get shocked
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
|
||||
|
||||
/obj/item/weapon/cell/infinite/check_charge()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/cell/infinite/use()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/cell/potato
|
||||
name = "potato battery"
|
||||
desc = "A rechargable starch based power cell."
|
||||
origin_tech = list(TECH_POWER = 1)
|
||||
icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
|
||||
icon_state = "potato_cell" //"potato_battery"
|
||||
charge = 100
|
||||
maxcharge = 300
|
||||
minor_fault = 1
|
||||
|
||||
/obj/item/weapon/cell/slime
|
||||
name = "charged slime core"
|
||||
desc = "A yellow slime core infused with phoron, it crackles with power."
|
||||
origin_tech = list(TECH_POWER = 4, TECH_BIO = 5)
|
||||
icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi'
|
||||
icon_state = "yellow slime extract" //"potato_battery"
|
||||
description_info = "This 'cell' holds a max charge of 10k and self recharges over time."
|
||||
maxcharge = 10000
|
||||
matter = null
|
||||
self_recharge = TRUE
|
||||
@@ -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
|
||||
@@ -328,6 +356,14 @@
|
||||
name = "extended magazine (5.45mm armor-piercing)"
|
||||
max_ammo = 30
|
||||
|
||||
/obj/item/ammo_magazine/m545/hunter
|
||||
name = "magazine (5.45mm hunting)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/hunter
|
||||
|
||||
/obj/item/ammo_magazine/m545/hunter/ext
|
||||
name = "extended magazine (5.45mm hunting)"
|
||||
max_ammo = 30
|
||||
|
||||
/obj/item/ammo_magazine/m545/small
|
||||
name = "reduced magazine (5.45mm)"
|
||||
icon_state = "m545-small"
|
||||
@@ -345,6 +381,10 @@
|
||||
name = "magazine (5.45mm armor-piercing)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/ap
|
||||
|
||||
/obj/item/ammo_magazine/m545/small/hunter
|
||||
name = "magazine (5.45mm hunting)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/hunter
|
||||
|
||||
/obj/item/ammo_magazine/clip/c545
|
||||
name = "ammo clip (5.45mm)"
|
||||
icon_state = "clip_rifle"
|
||||
@@ -358,6 +398,10 @@
|
||||
name = "rifle clip (5.45mm armor-piercing)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/ap
|
||||
|
||||
/obj/item/ammo_magazine/clip/c545/hunter
|
||||
name = "rifle clip (5.45mm hunting)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/hunter
|
||||
|
||||
/obj/item/ammo_magazine/clip/c545/practice
|
||||
name = "rifle clip (5.45mm practice)"
|
||||
ammo_type = /obj/item/ammo_casing/a545
|
||||
@@ -378,6 +422,10 @@
|
||||
name = "magazine box (5.45mm armor-piercing)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/ap
|
||||
|
||||
/obj/item/ammo_magazine/m545saw/hunter
|
||||
name = "magazine box (5.45mm hunting)"
|
||||
ammo_type = /obj/item/ammo_casing/a545/hunter
|
||||
|
||||
/obj/item/ammo_magazine/m545saw/empty
|
||||
initial_ammo = 0
|
||||
|
||||
@@ -477,6 +525,10 @@
|
||||
name = "rifle clip (7.62mm practice)"
|
||||
ammo_type = /obj/item/ammo_casing/a762p
|
||||
|
||||
/obj/item/ammo_magazine/clip/c762/hunter
|
||||
name = "rifle clip (7.62mm hunting)"
|
||||
ammo_type = /obj/item/ammo_casing/a762/hunter
|
||||
|
||||
/obj/item/ammo_magazine/m762svd
|
||||
name = "\improper SVD magazine (7.62mm)"
|
||||
icon_state = "SVD"
|
||||
@@ -523,12 +575,12 @@
|
||||
|
||||
/obj/item/ammo_magazine/clip/c12g
|
||||
name = "ammo clip (12g slug)"
|
||||
icon_state = "12gclipslug" //largely a codersprite, looks good enough. feel free to make a better one.
|
||||
icon_state = "12gclipslug" // Still a placeholder sprite. Feel free to make a better one.
|
||||
desc = "A color-coded metal clip for holding and quickly loading shotgun shells. This one is loaded with slugs."
|
||||
caliber = "12g"
|
||||
ammo_type = /obj/item/ammo_casing/a12g
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1790) // slugs shells x4 + 350 metal for the clip itself.
|
||||
max_ammo = 4
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1070) // slugs shells x2 + 350 metal for the clip itself.
|
||||
max_ammo = 2
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_magazine/clip/c12g/pellet
|
||||
@@ -536,14 +588,14 @@
|
||||
icon_state = "12gclipshell"
|
||||
desc = "A color-coded metal clip for holding and quickly loading shotgun shells. This one is loaded with buckshot."
|
||||
ammo_type = /obj/item/ammo_casing/a12g/pellet
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1790) // buckshot and slugs cost the same
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1070) // buckshot and slugs cost the same
|
||||
|
||||
/obj/item/ammo_magazine/clip/c12g/beanbag
|
||||
name = "ammo clip (12g beanbag)"
|
||||
icon_state = "12gclipbean"
|
||||
desc = "A color-coded metal clip for holding and quickly loading shotgun shells. This one is loaded with beanbags."
|
||||
ammo_type = /obj/item/ammo_casing/a12g/beanbag
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1070) //beanbags x4 + 350 metal
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 710) //beanbags x2 + 350 metal
|
||||
|
||||
///////// .75 Gyrojet /////////
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user