Deconflict

This commit is contained in:
Arkatos1
2019-08-26 18:53:55 +02:00
476 changed files with 11894 additions and 7105 deletions
+3 -2
View File
@@ -120,7 +120,8 @@ var/list/admin_verbs_event = list(
/client/proc/cmd_admin_create_centcom_report,
/client/proc/fax_panel,
/client/proc/event_manager_panel,
/client/proc/modify_goals
/client/proc/modify_goals,
/client/proc/outfit_manager
)
var/list/admin_verbs_spawn = list(
@@ -644,7 +645,7 @@ var/list/admin_verbs_ticket = list(
if(!message)
return
for(var/mob/V in hearers(O))
V.show_message(message, 2)
V.show_message(admin_pencode_to_html(message), 2)
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
message_admins("<span class='notice'>[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound</span>")
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+262
View File
@@ -0,0 +1,262 @@
GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/client/proc/outfit_manager()
set category = "Event"
set name = "Outfit Manager"
if(!check_rights(R_EVENT))
return
holder.outfit_manager(usr)
/datum/admins/proc/outfit_manager(mob/admin)
var/list/dat = list("<ul>")
for(var/datum/outfit/O in GLOB.custom_outfits)
var/vv = FALSE
var/datum/outfit/varedit/VO = O
if(istype(VO))
vv = length(VO.vv_values)
dat += "<li>[O.name][vv ? "(VV)" : ""]</li> <a href='?_src_=holder;save_outfit=1;chosen_outfit=[O.UID()]'>Save</a> <a href='?_src_=holder;delete_outfit=1;chosen_outfit=[O.UID()]'>Delete</a>"
dat += "</ul>"
dat += "<a href='?_src_=holder;create_outfit_menu=1'>Create</a><br>"
dat += "<a href='?_src_=holder;load_outfit=1'>Load from file</a>"
admin << browse(dat.Join(),"window=outfitmanager")
/datum/admins/proc/save_outfit(mob/admin,datum/outfit/O)
O.save_to_file(admin)
outfit_manager(admin)
/datum/admins/proc/delete_outfit(mob/admin,datum/outfit/O)
GLOB.custom_outfits -= O
qdel(O)
to_chat(admin,"<span class='notice'>Outfit deleted.</span>")
outfit_manager(admin)
/datum/admins/proc/load_outfit(mob/admin)
var/outfit_file = input("Pick outfit json file:", "File") as null|file
if(!outfit_file)
return
var/filedata = file2text(outfit_file)
var/json = json_decode(filedata)
if(!json)
to_chat(admin,"<span class='warning'>JSON decode error.</span>")
return
var/otype = text2path(json["outfit_type"])
if(!ispath(otype,/datum/outfit))
to_chat(admin,"<span class='warning'>Malformed/Outdated file.</span>")
return
var/datum/outfit/O = new otype
if(!O.load_from(json))
to_chat(admin,"<span class='warning'>Malformed/Outdated file.</span>")
return
GLOB.custom_outfits += O
outfit_manager(admin)
/datum/admins/proc/create_outfit(mob/admin)
var/list/uniforms = typesof(/obj/item/clothing/under)
var/list/suits = typesof(/obj/item/clothing/suit)
var/list/gloves = typesof(/obj/item/clothing/gloves)
var/list/shoes = typesof(/obj/item/clothing/shoes)
var/list/headwear = typesof(/obj/item/clothing/head)
var/list/glasses = typesof(/obj/item/clothing/glasses)
var/list/masks = typesof(/obj/item/clothing/mask)
var/list/pdas = typesof(/obj/item/pda)
var/list/ids = typesof(/obj/item/card/id)
var/uniform_select = "<select name=\"outfit_uniform\"><option value=\"\">None</option>"
for(var/path in uniforms)
uniform_select += "<option value=\"[path]\">[path]</option>"
uniform_select += "</select>"
var/suit_select = "<select name=\"outfit_suit\"><option value=\"\">None</option>"
for(var/path in suits)
suit_select += "<option value=\"[path]\">[path]</option>"
suit_select += "</select>"
var/gloves_select = "<select name=\"outfit_gloves\"><option value=\"\">None</option>"
for(var/path in gloves)
gloves_select += "<option value=\"[path]\">[path]</option>"
gloves_select += "</select>"
var/shoes_select = "<select name=\"outfit_shoes\"><option value=\"\">None</option>"
for(var/path in shoes)
shoes_select += "<option value=\"[path]\">[path]</option>"
shoes_select += "</select>"
var/head_select = "<select name=\"outfit_head\"><option value=\"\">None</option>"
for(var/path in headwear)
head_select += "<option value=\"[path]\">[path]</option>"
head_select += "</select>"
var/glasses_select = "<select name=\"outfit_glasses\"><option value=\"\">None</option>"
for(var/path in glasses)
glasses_select += "<option value=\"[path]\">[path]</option>"
glasses_select += "</select>"
var/mask_select = "<select name=\"outfit_mask\"><option value=\"\">None</option>"
for(var/path in masks)
mask_select += "<option value=\"[path]\">[path]</option>"
mask_select += "</select>"
var/id_select = "<select name=\"outfit_id\"><option value=\"\">None</option>"
for(var/path in ids)
id_select += "<option value=\"[path]\">[path]</option>"
id_select += "</select>"
var/pda_select = "<select name=\"outfit_pda\"><option value=\"\">None</option>"
for(var/path in pdas)
pda_select += "<option value=\"[path]\">[path]</option>"
pda_select += "</select>"
var/dat = {"
<html><head><title>Create Outfit</title></head><body>
<form name="outfit" action="byond://?src=[UID()];" method="get">
<input type="hidden" name="src" value="[UID()]">
<input type="hidden" name="create_outfit_finalize" value="1">
<table>
<tr>
<th>Name:</th>
<td>
<input type="text" name="outfit_name" value="Custom Outfit">
</td>
</tr>
<tr>
<th>Uniform:</th>
<td>
[uniform_select]
</td>
</tr>
<tr>
<th>Suit:</th>
<td>
[suit_select]
</td>
</tr>
<tr>
<th>Back:</th>
<td>
<input type="text" name="outfit_back" value="">
</td>
</tr>
<tr>
<th>Belt:</th>
<td>
<input type="text" name="outfit_belt" value="">
</td>
</tr>
<tr>
<th>Gloves:</th>
<td>
[gloves_select]
</td>
</tr>
<tr>
<th>Shoes:</th>
<td>
[shoes_select]
</td>
</tr>
<tr>
<th>Head:</th>
<td>
[head_select]
</td>
</tr>
<tr>
<th>Mask:</th>
<td>
[mask_select]
</td>
</tr>
<tr>
<th>Left Ear:</th>
<td>
<input type="text" name="outfit_l_ear" value="">
</td>
</tr>
<tr>
<th>Right Ear:</th>
<td>
<input type="text" name="outfit_r_ear" value="">
</td>
</tr>
<tr>
<th>Glasses:</th>
<td>
[glasses_select]
</td>
</tr>
<tr>
<th>ID:</th>
<td>
[id_select]
</td>
</tr>
<tr>
<th>PDA:</th>
<td>
[pda_select]
</td>
</tr>
<tr>
<th>Left Pocket:</th>
<td>
<input type="text" name="outfit_l_pocket" value="">
</td>
</tr>
<tr>
<th>Right Pocket:</th>
<td>
<input type="text" name="outfit_r_pocket" value="">
</td>
</tr>
<tr>
<th>Suit Store:</th>
<td>
<input type="text" name="outfit_s_store" value="">
</td>
</tr>
<tr>
<th>Right Hand:</th>
<td>
<input type="text" name="outfit_r_hand" value="">
</td>
</tr>
<tr>
<th>Left Hand:</th>
<td>
<input type="text" name="outfit_l_hand" value="">
</td>
</tr>
</table>
<br>
<input type="submit" value="Save">
</form></body></html>
"}
admin << browse(dat, "window=dressup;size=550x600")
/datum/admins/proc/create_outfit_finalize(mob/admin, list/href_list)
var/datum/outfit/O = new
O.name = href_list["outfit_name"]
O.uniform = text2path(href_list["outfit_uniform"])
O.shoes = text2path(href_list["outfit_shoes"])
O.gloves = text2path(href_list["outfit_gloves"])
O.suit = text2path(href_list["outfit_suit"])
O.head = text2path(href_list["outfit_head"])
O.back = text2path(href_list["outfit_back"])
O.mask = text2path(href_list["outfit_mask"])
O.glasses = text2path(href_list["outfit_glasses"])
O.r_hand = text2path(href_list["outfit_r_hand"])
O.l_hand = text2path(href_list["outfit_l_hand"])
O.suit_store = text2path(href_list["outfit_s_store"])
O.l_pocket = text2path(href_list["outfit_l_pocket"])
O.r_pocket = text2path(href_list["outfit_r_pocket"])
O.id = text2path(href_list["outfit_id"])
O.pda = text2path(href_list["outfit_pda"])
O.belt = text2path(href_list["outfit_belt"])
O.l_ear = text2path(href_list["outfit_l_ear"])
O.r_ear = text2path(href_list["outfit_r_ear"])
GLOB.custom_outfits.Add(O)
message_admins("[key_name_admin(usr)] created \"[O.name]\" outfit.")
+47 -12
View File
@@ -341,9 +341,6 @@
if("Cancel") return
if("Yes") delmob = 1
log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
message_admins("<span class='notice'>[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]</span>", 1)
switch(href_list["simplemake"])
if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob, 1 )
if("drone") M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob, 1 )
@@ -351,7 +348,11 @@
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 )
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
if("human") M.change_mob_type( /mob/living/carbon/human, null, null, delmob, 1 )
if("human")
var/posttransformoutfit = usr.client.robust_dress_shop()
var/mob/living/carbon/human/newmob = M.change_mob_type(/mob/living/carbon/human, null, null, delmob, 1)
if(posttransformoutfit && istype(newmob))
newmob.equipOutfit(posttransformoutfit)
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 )
if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
@@ -368,6 +369,9 @@
if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 )
if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 )
log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
message_admins("<span class='notice'>[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]</span>", 1)
/////////////////////////////////////new ban stuff
else if(href_list["unbanf"])
@@ -1510,14 +1514,22 @@
usr.client.cmd_admin_animalize(M)
else if(href_list["incarn_ghost"])
if(!check_rights(R_SPAWN)) return
if(!check_rights(R_SPAWN))
return
var/mob/dead/observer/G = locateUID(href_list["incarn_ghost"])
if(!istype(G))
to_chat(usr, "This will only work on /mob/dead/observer")
log_admin("[key_name(G)] was incarnated by [key_name(src.owner)]")
message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(src.owner)]")
G.incarnate_ghost()
var/posttransformoutfit = usr.client.robust_dress_shop()
var/mob/living/carbon/human/H = G.incarnate_ghost()
if(posttransformoutfit && istype(H))
H.equipOutfit(posttransformoutfit)
log_admin("[key_name(G)] was incarnated by [key_name(owner)]")
message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(owner)]")
else if(href_list["togmutate"])
if(!check_rights(R_SPAWN)) return
@@ -1930,7 +1942,7 @@
evilcookie.reagents.add_reagent("mutagen", 10)
evilcookie.desc = "It has a faint green glow."
evilcookie.bitesize = 100
evilcookie.flags = NODROP
evilcookie.flags = NODROP | DROPDEL
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a mutagen cookie."
@@ -1939,7 +1951,7 @@
evilcookie.reagents.add_reagent("hell_water", 25)
evilcookie.desc = "Sulphur-flavored."
evilcookie.bitesize = 100
evilcookie.flags = NODROP
evilcookie.flags = NODROP | DROPDEL
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
@@ -2171,7 +2183,7 @@
var/obj/item/paper/P = new /obj/item/paper(null) //hopefully the null loc won't cause trouble for us
if(!fax)
var/list/departmentoptions = alldepartments + "All Departments"
var/list/departmentoptions = alldepartments + hidden_departments + "All Departments"
destination = input(usr, "To which department?", "Choose a department", "") as null|anything in departmentoptions
if(!destination)
qdel(P)
@@ -2186,7 +2198,7 @@
if(!input)
qdel(P)
return
input = P.parsepencode(input) // Encode everything from pencode to html
input = admin_pencode_to_html(html_encode(input)) // Encode everything from pencode to html
var/customname = clean_input("Pick a title for the fax.", "Fax Title", , owner)
if(!customname)
@@ -3373,6 +3385,29 @@
message_admins("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]")
log_admin("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]")
else if(href_list["create_outfit_finalize"])
if(!check_rights(R_EVENT))
return
create_outfit_finalize(usr,href_list)
else if(href_list["load_outfit"])
if(!check_rights(R_EVENT))
return
load_outfit(usr)
else if(href_list["create_outfit_menu"])
if(!check_rights(R_EVENT))
return
create_outfit(usr)
else if(href_list["delete_outfit"])
if(!check_rights(R_EVENT))
return
var/datum/outfit/O = locate(href_list["chosen_outfit"]) in GLOB.custom_outfits
delete_outfit(usr,O)
else if(href_list["save_outfit"])
if(!check_rights(R_EVENT))
return
var/datum/outfit/O = locate(href_list["chosen_outfit"]) in GLOB.custom_outfits
save_outfit(usr,O)
/client/proc/create_eventmob_for(var/mob/living/carbon/human/H, var/killthem = 0)
if(!check_rights(R_EVENT))
return
+4 -3
View File
@@ -110,7 +110,7 @@
if(!msg)
return
else
msg = pencode_to_html(msg)
msg = admin_pencode_to_html(msg)
var/recieve_span = "playerreply"
var/send_pm_type = " "
@@ -161,7 +161,9 @@
var/emoji_msg = "<span class='emoji_enabled'>[msg]</span>"
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]</b>: [emoji_msg]</span>"
to_chat(C, recieve_message)
to_chat(src, "<span class='pmsend'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</span>")
var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(<a href='?src=[pm_tracker.UID()];ping=[C.key]'>PING</a>)" : ""
var/window_link = "(<a href='?src=[pm_tracker.UID()];newtitle=[C.key]'>WINDOW</a>)"
to_chat(src, "<span class='pmsend'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</span> [ping_link] [window_link]")
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
@@ -380,7 +382,6 @@
window_flash(C)
C.pm_tracker.show_ui(C.mob)
to_chat(usr, "<span class='notice'>Forced open [C]'s messages window.</span>")
show_ui(usr)
return
if(href_list["reply"])
+60 -90
View File
@@ -576,109 +576,79 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_EVENT))
return
if(!ishuman(M))
if(!ishuman(M) && !isobserver(M))
alert("Invalid mob")
return
var/list/choices = list(
"strip",
"as job...",
"emergency response team member",
"emergency response team leader"
var/dresscode = robust_dress_shop()
if(!dresscode)
return
var/delete_pocket
var/mob/living/carbon/human/H
if(isobserver(M))
H = M.change_mob_type(/mob/living/carbon/human, null, null, TRUE)
else
H = M
if(H.l_store || H.r_store || H.s_store) //saves a lot of time for admins and coders alike
if(alert("Should the items in their pockets be dropped? Selecting \"No\" will delete them.", "Robust quick dress shop", "Yes", "No") == "No")
delete_pocket = TRUE
for (var/obj/item/I in H.get_equipped_items(delete_pocket))
qdel(I)
if(dresscode != "Naked")
H.equipOutfit(dresscode)
H.regenerate_icons()
feedback_add_details("admin_verb", "SE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
message_admins("<span class='notice'>[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].</span>", 1)
/client/proc/robust_dress_shop()
var/list/outfits = list(
"Naked",
"As Job...",
"Custom..."
)
var/admin_outfits = subtypesof(/datum/outfit/admin)
for(var/type in admin_outfits)
var/datum/outfit/O = type
var/name = initial(O.name)
if(name != "Naked")
choices[initial(O.name)] = type
var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job)
for(var/path in paths)
var/datum/outfit/O = path //not much to initalize here but whatever
if(initial(O.can_be_admin_equipped))
outfits[initial(O.name)] = path
var/dostrip = 0
switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel"))
if("Yes")
dostrip = 1
if("Cancel")
return
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in choices
var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits
if(isnull(dresscode))
return
var/datum/outfit/O
if(!(dresscode in list("strip", "as job...", "emergency response team member", "emergency response team leader")))
O = choices[dresscode]
if(outfits[dresscode])
dresscode = outfits[dresscode]
var/datum/job/jobdatum
if(dresscode == "as job...")
var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
jobdatum = SSjobs.GetJob(jobname)
if(dresscode == "As Job...")
var/list/job_paths = subtypesof(/datum/outfit/job)
var/list/job_outfits = list()
for(var/path in job_paths)
var/datum/outfit/O = path
if(initial(O.can_be_admin_equipped))
job_outfits[initial(O.name)] = path
feedback_add_details("admin_verb", "SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(dostrip)
for(var/obj/item/I in M)
if(istype(I, /obj/item/implant))
continue
if(istype(I, /obj/item/organ))
continue
qdel(I)
dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits
dresscode = job_outfits[dresscode]
if(isnull(dresscode))
return
if(dresscode == "Custom...")
var/list/custom_names = list()
for(var/datum/outfit/D in GLOB.custom_outfits)
custom_names[D.name] = D
var/selected_name = input("Select outfit", "Robust quick dress shop") as null|anything in custom_names
dresscode = custom_names[selected_name]
if(isnull(dresscode))
return
switch(dresscode)
if("strip")
//do nothing
// god is dead
if("as job...")
if(jobdatum)
dresscode = "[jobdatum.title]"
jobdatum.equip(M)
if("emergency response team member", "emergency response team leader")
var/datum/response_team/equip_team = null
switch(alert("Level", "Emergency Response Team", "Amber", "Red", "Gamma"))
if("Amber")
equip_team = new /datum/response_team/amber
if("Red")
equip_team = new /datum/response_team/red
if("Gamma")
equip_team = new /datum/response_team/gamma
if(!equip_team)
return
if(dresscode == "emergency response team leader")
equip_team.equip_officer("Commander", M)
else
var/list/ert_outfits = list("Security", "Engineer", "Medic", "Janitor", "Paranormal")
var/echoice = input("Loadout Type", "Emergency Response Team") as null|anything in ert_outfits
if(!echoice)
return
switch(echoice)
if("Commander")
equip_team.equip_officer("Commander", M)
if("Security")
equip_team.equip_officer("Security", M)
if("Engineer")
equip_team.equip_officer("Engineer", M)
if("Medic")
equip_team.equip_officer("Medic", M)
if("Janitor")
equip_team.equip_officer("Janitor", M)
if("Paranormal")
equip_team.equip_officer("Paranormal", M)
else
to_chat(src, "Invalid ERT Loadout selected")
else // outfit datum
if(O)
M.equipOutfit(O, FALSE)
M.regenerate_icons()
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
message_admins("<span class='notice'>[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].</span>", 1)
return
return dresscode
/client/proc/startSinglo()
set category = "Debug"
+4 -2
View File
@@ -58,6 +58,9 @@
if(!msg)
return
msg = admin_pencode_to_html(msg)
if(usr)
if(usr.client)
if(usr.client.holder)
@@ -136,7 +139,7 @@
if( !msg )
return
msg = pencode_to_html(msg)
msg = admin_pencode_to_html(msg)
to_chat(M, msg)
log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]")
@@ -613,7 +616,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What's the message?") as message|null
if(!input)
return
input = html_encode(input)
switch(alert("Should this be announced to the general population?",,"Yes","No", "Cancel"))
if("Yes")
@@ -147,7 +147,6 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber/red(src), slot_l_store)
if(full_gear)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
+1 -3
View File
@@ -341,9 +341,8 @@
uniform = /obj/item/clothing/under/rank/engineer
belt = /obj/item/storage/belt/utility/full
suit = /obj/item/clothing/suit/space/hardsuit
suit = /obj/item/clothing/suit/space/hardsuit/engine
shoes = /obj/item/clothing/shoes/workboots
head = /obj/item/clothing/head/helmet/space/hardsuit
mask = /obj/item/clothing/mask/breath
id = /obj/item/card/id/engineering
l_pocket = /obj/item/t_scanner
@@ -423,7 +422,6 @@
/datum/outfit/job/mining/suit
name = "Shaft Miner"
suit = /obj/item/clothing/suit/space/hardsuit/mining
head = /obj/item/clothing/head/helmet/space/hardsuit/mining
uniform = /obj/item/clothing/under/rank/miner
gloves = /obj/item/clothing/gloves/fingerless
shoes = /obj/item/clothing/shoes/workboots
@@ -193,7 +193,7 @@
servant_mind.objectives += O
servant_mind.transfer_to(H)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 50)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 300)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
@@ -161,6 +161,7 @@
armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
item_color = "ancient"
resistance_flags = FIRE_PROOF
sprite_sheets = null
/obj/item/clothing/suit/space/hardsuit/ancient
name = "prototype RIG hardsuit"
@@ -170,6 +171,8 @@
armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
slowdown = 3
resistance_flags = FIRE_PROOF
sprite_sheets = null
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient
var/footstep = 1
/obj/item/clothing/suit/space/hardsuit/ancient/on_mob_move()
+5 -2
View File
@@ -143,7 +143,7 @@
if("5")
karma_purchase(karma,45,"species","Slime People")
if("6")
karma_purchase(karma,100,"species","Plasmaman")
karma_purchase(karma,45,"species","Plasmaman")
if("7")
karma_purchase(karma,30,"species","Drask")
if(href_list["KarmaRefund"])
@@ -401,7 +401,7 @@
if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them.
to_chat(src, "<span class='warning'>Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.</span>")
//This is down here because of the browse() calls in tooltip/New()
if(!tooltips)
tooltips = new /datum/tooltip(src)
@@ -433,6 +433,9 @@
GLOB.admins -= src
GLOB.directory -= ckey
GLOB.clients -= src
if(movingmob)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
Master.UpdateTickRate()
return ..()
@@ -201,6 +201,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//Gear stuff
var/list/gear = list()
var/gear_tab = "General"
// Parallax
var/parallax = PARALLAX_HIGH
/datum/preferences/New(client/C)
parent = C
@@ -462,6 +464,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<b>OOC Color:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
if(config.allow_Metadata)
dat += "<b>OOC Notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
dat += "<b>Parallax (Fancy Space):</b> <a href='?_src_=prefs;preference=parallax'>"
switch (parallax)
if(PARALLAX_LOW)
dat += "Low"
if(PARALLAX_MED)
dat += "Medium"
if(PARALLAX_INSANE)
dat += "Insane"
if(PARALLAX_DISABLE)
dat += "Disabled"
else
dat += "High"
dat += "</a><br>"
dat += "<b>Play Admin MIDIs:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Play Lobby Music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Randomized Character Slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
@@ -2072,6 +2087,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(href_list["tab"])
current_tab = text2num(href_list["tab"])
if("ambientocclusion")
toggles ^= AMBIENT_OCCLUSION
if(parent && parent.screen && parent.screen.len)
@@ -2080,6 +2096,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(toggles & AMBIENT_OCCLUSION)
PM.filters += FILTER_AMBIENT_OCCLUSION
if("parallax")
var/parallax_styles = list(
"Off" = PARALLAX_DISABLE,
"Low" = PARALLAX_LOW,
"Medium" = PARALLAX_MED,
"High" = PARALLAX_HIGH,
"Insane" = PARALLAX_INSANE
)
parallax = parallax_styles[input(user, "Pick a parallax style", "Parallax Style") as null|anything in parallax_styles]
if(parent && parent.mob && parent.mob.hud_used)
parent.mob.hud_used.update_parallax_pref()
ShowChoices(user)
return 1
@@ -20,7 +20,8 @@
clientfps,
atklog,
fuid,
afk_watch
afk_watch,
parallax
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -54,6 +55,7 @@
atklog = text2num(query.item[18])
fuid = text2num(query.item[19])
afk_watch = text2num(query.item[20])
parallax = text2num(query.item[21])
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -75,6 +77,7 @@
atklog = sanitize_integer(atklog, 0, 100, initial(atklog))
fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid))
afk_watch = sanitize_integer(afk_watch, 0, 1, initial(afk_watch))
parallax = sanitize_integer(parallax, 0, 16, initial(parallax))
return 1
/datum/preferences/proc/save_preferences(client/C)
@@ -105,7 +108,8 @@
ghost_anonsay='[ghost_anonsay]',
clientfps='[clientfps]',
atklog='[atklog]',
afk_watch='[afk_watch]'
afk_watch='[afk_watch]',
parallax='[parallax]'
WHERE ckey='[C.ckey]'"}
)
+30 -1
View File
@@ -15,7 +15,8 @@
standard_outfit_options = list()
for(var/path in subtypesof(/datum/outfit/job))
var/datum/outfit/O = path
standard_outfit_options[initial(O.name)] = path
if(initial(O.can_be_admin_equipped))
standard_outfit_options[initial(O.name)] = path
sortTim(standard_outfit_options, /proc/cmp_text_asc)
outfit_options = standard_outfit_options
@@ -276,6 +277,34 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/glasses/chameleon/thermal
origin_tech = "magnets=3;syndicate=4"
vision_flags = SEE_MOBS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
flash_protect = -1
prescription_upgradable = TRUE
/obj/item/clothing/glasses/hud/security/chameleon
flash_protect = 1
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/glasses/hud/security/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/glasses
chameleon_action.chameleon_name = "HUD"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/glasses/hud/security/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/gloves/chameleon
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
+66 -20
View File
@@ -2,7 +2,6 @@
name = "clothing"
burn_state = FLAMMABLE
var/list/species_restricted = null //Only these species can wear this kit.
var/hardsuit_restrict_helmet = 0 // Stops the user from equipping a hardsuit helmet without attaching it to the suit first.
var/scan_reagents = 0 //Can the wearer see reagents while it's equipped?
/*
@@ -18,8 +17,10 @@
var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 //but seperated to allow items to protect but not impair vision, like space helmets
var/visor_flags = 0 //flags that are added/removed when an item is adjusted up/down
var/visor_flags_inv = 0 //same as visor_flags, but for flags_inv
var/visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_VISIONFLAGS | VISOR_DARKNESSVIEW | VISOR_INVISVIEW //what to toggle when toggled with weldingvisortoggle()
var/toggle_message = null
var/alt_toggle_message = null
@@ -30,6 +31,39 @@
var/species_disguise = null
var/magical = FALSE
/obj/item/clothing/proc/weldingvisortoggle(mob/user) //proc to toggle welding visors on helmets, masks, goggles, etc.
if(!can_use(user))
return FALSE
visor_toggling()
to_chat(user, "<span class='notice'>You adjust \the [src] [up ? "up" : "down"].</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.head_update(src, forced = 1)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
return TRUE
/obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags
up = !up
flags ^= visor_flags
flags_inv ^= visor_flags_inv
flags_cover ^= initial(flags_cover)
icon_state = "[initial(icon_state)][up ? "up" : ""]"
if(visor_vars_to_toggle & VISOR_FLASHPROTECT)
flash_protect ^= initial(flash_protect)
if(visor_vars_to_toggle & VISOR_TINT)
tint ^= initial(tint)
/obj/item/clothing/proc/can_use(mob/user)
if(user && ismob(user))
if(!user.incapacitated())
return TRUE
return FALSE
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
@@ -90,6 +124,10 @@
throwforce = 2
slot_flags = SLOT_EARS
burn_state = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/ears.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/ears.dmi'
) //We read you loud and skree-er.
/obj/item/clothing/ears/attack_hand(mob/user)
if(!user)
@@ -469,6 +507,7 @@ BLIND // can't see anything
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
var/suittoggled = FALSE
var/suit_adjusted = 0
var/ignore_suitadjust = 1
var/adjust_flavour = null
@@ -625,38 +664,45 @@ BLIND // can't see anything
/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A)
if(istype(A))
. = 1
. = TRUE
else
return 0
return FALSE
if(accessories.len)
for(var/obj/item/clothing/accessory/AC in accessories)
if((A.slot in list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND)) && AC.slot == A.slot)
return 0
return FALSE
if(!A.allow_duplicates && AC.type == A.type)
return 0
return FALSE
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clothing/accessory))
var/obj/item/clothing/accessory/A = I
if(can_attach_accessory(A))
user.unEquip(I) // Make absolutely sure this accessory is removed from hands
accessories += A
A.on_attached(src, user)
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
return
else
to_chat(user, "<span class='notice'>You cannot attach more accessories of this type to [src].</span>")
attach_accessory(I, user, TRUE)
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
A.attackby(I, user, params)
return
return TRUE
..()
. = ..()
/obj/item/clothing/under/proc/attach_accessory(obj/item/clothing/accessory/A, mob/user, unequip = FALSE)
if(can_attach_accessory(A))
if(unequip && !user.unEquip(A)) // Make absolutely sure this accessory is removed from hands
return FALSE
accessories += A
A.on_attached(src, user)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
return TRUE
else
to_chat(user, "<span class='notice'>You cannot attach more accessories of this type to [src].</span>")
return FALSE
/obj/item/clothing/under/examine(mob/user)
..(user)
+1 -1
View File
@@ -14,7 +14,7 @@
desc = "Unce unce unce unce."
var/on = 0
icon_state = "headphones0"
item_state = "earmuffs"
item_state = null
actions_types = list(/datum/action/item_action/toggle_headphones)
burn_state = FLAMMABLE
+41 -105
View File
@@ -30,6 +30,21 @@
return
return ..()
/obj/item/clothing/glasses/visor_toggling()
..()
if(visor_vars_to_toggle & VISOR_VISIONFLAGS)
vision_flags ^= initial(vision_flags)
if(visor_vars_to_toggle & VISOR_DARKNESSVIEW)
see_in_dark ^= initial(see_in_dark)
if(visor_vars_to_toggle & VISOR_INVISVIEW)
invis_view ^= initial(invis_view)
/obj/item/clothing/glasses/weldingvisortoggle(mob/user)
. = ..()
if(. && user)
user.update_sight()
user.update_inv_glasses()
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
@@ -43,7 +58,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/meson/night
@@ -91,7 +107,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
actions_types = list(/datum/action/item_action/toggle_research_scanner)
@@ -140,7 +157,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/monocle
@@ -196,7 +214,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/regular/hipster
@@ -213,7 +232,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/gglasses
@@ -224,7 +244,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
prescription_upgradable = 1
@@ -324,40 +345,15 @@
actions_types = list(/datum/action/item_action/toggle)
flash_protect = 2
tint = 2
visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/welding/attack_self()
toggle()
/obj/item/clothing/glasses/welding/proc/toggle()
if(up)
up = !up
flags_cover |= GLASSESCOVERSEYES
flags_inv |= HIDEEYES
icon_state = initial(icon_state)
to_chat(usr, "You flip the [src] down to protect your eyes.")
flash_protect = 2
tint = initial(tint) //better than istype
else
up = !up
flags_cover &= ~GLASSESCOVERSEYES
flags_inv &= ~HIDEEYES
icon_state = "[initial(icon_state)]up"
to_chat(usr, "You push the [src] up out of your face.")
flash_protect = 0
tint = 0
var/mob/living/carbon/user = usr
user.update_tint()
user.update_inv_glasses()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/glasses/welding/attack_self(mob/user)
weldingvisortoggle(user)
/obj/item/clothing/glasses/welding/superior
name = "superior welding goggles"
@@ -397,7 +393,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/thermal/emp_act(severity)
@@ -413,25 +410,6 @@
M.CureNearsighted()
..()
/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
icon_state = "meson"
origin_tech = "magnets=3;syndicate=4"
prescription_upgradable = 1
/obj/item/clothing/glasses/thermal/syndi/sunglasses
name = "sunglasses"
desc = "Strangely ancient technology used to help provide rudimentary eye cover."
icon_state = "sun"
item_state = "sunglasses"
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/thermal/monocle
name = "Thermoncle"
desc = "A monocle thermal."
@@ -457,56 +435,6 @@
item_state = "eyepatch"
flags = NODROP
/obj/item/clothing/glasses/proc/chameleon(var/mob/user)
var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") as null|anything in list("Sunglasses", "Medical HUD", "Mesons", "Science Goggles", "Glasses", "Security Sunglasses","Eyepatch","Welding","Gar")
if(user && src in user.contents)
switch(input_glasses)
if("Sunglasses")
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
name = "sunglasses"
icon_state = "sun"
item_state = "sunglasses"
if("Medical HUD")
name = "Health Scanner HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
icon_state = "healthhud"
item_state = "healthhud"
if("Mesons")
name = "Optical Meson Scanner"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
item_state = "meson"
if("Science Goggles")
name = "Science Goggles"
desc = "A pair of snazzy goggles used to protect against chemical spills."
icon_state = "purple"
item_state = "glasses"
if("Glasses")
name = "Prescription Glasses"
desc = "Made by Nerd. Co."
icon_state = "glasses"
item_state = "glasses"
if("Security Sunglasses")
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
icon_state = "sunhud"
item_state = "sunglasses"
if("Eyepatch")
name = "eyepatch"
desc = "Yarr."
icon_state = "eyepatch"
item_state = "eyepatch"
if("Welding")
name = "welding goggles"
desc = "Protects the eyes from welders; approved by the mad scientist association."
icon_state = "welding-g"
item_state = "welding-g"
if("Gar")
desc = "Just who the hell do you think I am?!"
name = "gar glasses"
icon_state = "gar"
item_state = "gar"
/obj/item/clothing/glasses/godeye
name = "eye of god"
@@ -520,6 +448,12 @@
flags_cover = null
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, src) && W != src && W.loc == user)
if(W.icon_state == "godeye")
@@ -545,7 +479,9 @@
tint = 0
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/tajblind/eng
+5 -8
View File
@@ -63,6 +63,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
@@ -91,13 +92,6 @@
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/hud/security/chameleon
name = "Chameleon Security HUD"
desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection."
flash_protect = 1
/obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user)
chameleon(user)
/obj/item/clothing/glasses/hud/security/sunglasses/jensenshades
name = "augmented shades"
@@ -146,6 +140,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
@@ -184,7 +179,9 @@
up = 0
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
/obj/item/clothing/glasses/hud/health/tajblind/attack_self()
@@ -38,6 +38,21 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
burn_state = FIRE_PROOF
/obj/item/clothing/gloves/bracer
name = "bone bracers"
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
icon_state = "bracers"
item_state = "bracers"
item_color = null //So they don't wash.
transfer_prints = TRUE
strip_delay = 40
body_parts_covered = ARMS
cold_protection = ARMS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
armor = list(melee = 15, bullet = 25, laser = 15, energy = 15, bomb = 20, bio = 10, rad = 0)
/obj/item/clothing/gloves/botanic_leather
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
name = "botanist's leather gloves"
@@ -24,6 +24,7 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
burn_state = FIRE_PROOF
sprite_sheets = list(
@@ -34,6 +35,9 @@
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
/obj/item/clothing/head/welding/flamedecal
name = "flame decal welding helmet"
desc = "A welding helmet adorned with flame decals, and several cryptic slogans of varying degrees of legibility."
+2 -1
View File
@@ -12,6 +12,7 @@
burn_state = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
@@ -43,7 +44,7 @@
icon_state = "voxmask"
item_state = "voxmask"
permeability_coefficient = 0.01
species_restricted = list("Vox")
species_restricted = list("Vox", "Vox Armalis") //These should fit the "Mega Vox" just fine.
actions_types = list()
/obj/item/clothing/mask/breath/vox/attack_self(var/mob/user)
+5 -27
View File
@@ -33,34 +33,12 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
origin_tech = "materials=2;engineering=3"
actions_types = list(/datum/action/item_action/toggle)
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = MASKCOVERSEYES
visor_flags_inv = HIDEEYES
/obj/item/clothing/mask/gas/welding/attack_self()
toggle()
/obj/item/clothing/mask/gas/welding/proc/toggle()
if(up)
up = !src.up
flags_cover |= (MASKCOVERSEYES)
flags_inv |= (HIDEEYES)
icon_state = initial(icon_state)
to_chat(usr, "You flip the [src] down to protect your eyes.")
flash_protect = 2
tint = 2
else
up = !up
flags_cover &= ~(MASKCOVERSEYES)
flags_inv &= ~(HIDEEYES)
icon_state = "[initial(icon_state)]up"
to_chat(usr, "You push the [src] up out of your face.")
flash_protect = 0
tint = 0
var/mob/living/carbon/user = usr
user.update_tint()
user.update_inv_wear_mask() //so our mob-overlays update
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/mask/gas/welding/attack_self(mob/user)
weldingvisortoggle(user)
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
+8 -4
View File
@@ -214,7 +214,8 @@
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
)
@@ -233,7 +234,8 @@
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
)
/obj/item/clothing/mask/fakemoustache/attack_self(mob/user)
@@ -308,7 +310,8 @@
var/originalname = ""
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/mask.dmi'
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
)
/obj/item/clothing/mask/horsehead/equipped(mob/user, slot)
@@ -420,7 +423,8 @@
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
)
actions_types = list(/datum/action/item_action/adjust)
+16 -2
View File
@@ -4,8 +4,8 @@
desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready."
icon_state = "hardsuit0-ert_commander"
item_state = "helm-command"
item_color = "ert_commander"
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
hardsuit_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
var/obj/machinery/camera/camera
var/has_camera = TRUE
strip_delay = 130
@@ -41,6 +41,7 @@
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/multitool, \
/obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \
/obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield, /obj/item/gun/energy/immolator/multi)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
strip_delay = 130
sprite_sheets = list(
@@ -67,11 +68,13 @@
desc = "A suit worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/commander
/obj/item/clothing/suit/space/hardsuit/ert/commander/gamma
name = "elite emergency response team commander suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gcommander"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/commander/gamma
//Security
/obj/item/clothing/head/helmet/space/hardsuit/ert/security
@@ -92,11 +95,13 @@
desc = "A suit worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_security"
item_state = "syndicate-black-red"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/security
/obj/item/clothing/suit/space/hardsuit/ert/security/gamma
name = "elite emergency response team security suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gsecurity"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/security/gamma
//Engineer
/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer
@@ -118,11 +123,13 @@
desc = "A suit worn by the engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_engineer"
item_state = "suit-orange"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer
/obj/item/clothing/suit/space/hardsuit/ert/engineer/gamma
name = "elite emergency response team engineer suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gengineer"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer/gamma
//Medical
/obj/item/clothing/head/helmet/space/hardsuit/ert/medical
@@ -141,11 +148,13 @@
name = "emergency response team medical suit"
desc = "A suit worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready."
icon_state = "ert_medical"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/medical
/obj/item/clothing/suit/space/hardsuit/ert/medical/gamma
name = "elite emergency response team medical suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gmedical"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/medical/gamma
//Janitor
/obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
@@ -159,15 +168,18 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "hardsuit0-gammajanitor"
item_color = "gammajanitor"
/obj/item/clothing/suit/space/hardsuit/ert/janitor
name = "emergency response team janitor suit"
desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_janitor"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
/obj/item/clothing/suit/space/hardsuit/ert/janitor/gamma
name = "elite emergency response team janitor suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gjanitor"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor/gamma
//Paranormal
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
@@ -186,7 +198,7 @@
icon_state = "hardsuit-paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
sprite_sheets = null
actions_types = list()
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/New()
..()
@@ -200,6 +212,7 @@
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
name = "inquisitor's hardsuit"
icon_state = "hardsuit-inquisitor"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker
name = "champion's helmet"
@@ -211,3 +224,4 @@
name = "champion's hardsuit"
desc = "Voices echo from the hardsuit, driving the user insane."
icon_state = "hardsuit-berserker"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker
+138 -285
View File
@@ -4,11 +4,12 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
hardsuit_restrict_helmet = 1
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
var/basestate = "hardsuit"
allowed = list(/obj/item/flashlight)
var/brightness_on = 4 //luminosity when on
var/on = 0
var/on = FALSE
var/obj/item/clothing/suit/space/hardsuit/suit
item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
actions_types = list(/datum/action/item_action/toggle_helmet_light)
@@ -31,28 +32,21 @@
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi'
)
/obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M)
if(hardsuit_restrict_helmet)
to_chat(M, "<span class='warning'>You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)</span>") // Stop hardsuit helmet equipping
return 0
..()
/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user)
toggle_light(user)
/obj/item/clothing/head/helmet/space/hardsuit/proc/toggle_light(mob/user)
on = !on
icon_state = "hardsuit[on]-[item_color]"
if(on)
set_light(brightness_on)
else
set_light(0)
icon_state = "[basestate][on]-[item_color]"
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
if(on)
set_light(brightness_on)
else
set_light(0)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
@@ -62,10 +56,32 @@
toggle_light()
visible_message("<span class='danger'>[src]'s light fades and turns off.</span>")
/obj/item/clothing/head/helmet/space/hardsuit/dropped(mob/user)
..()
if(suit)
suit.RemoveHelmet()
/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot)
if(slot == slot_head)
return 1
/obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot)
..()
if(slot != slot_head)
if(suit)
suit.RemoveHelmet()
else
qdel(src)
/obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg)
var/mob/wearer = loc
if(msg && ishuman(wearer))
wearer.show_message("<b><span class='robot'>[msg]</span></b>", 1)
/obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity)
..()
display_visor_message("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!")
/obj/item/clothing/suit/space/hardsuit
name = "hardsuit"
desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit."
@@ -74,7 +90,9 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd, /obj/item/rpd)
siemens_coefficient = 0
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
actions_types = list(/datum/action/item_action/toggle_helmet)
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran")
species_restricted = list("exclude","Diona","Wryn")
@@ -94,206 +112,64 @@
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi'
)
//Breach thresholds, should ideally be inherited by most (if not all) hardsuits.
breach_threshold = 18
can_breach = 0
//Component/device holders.
var/obj/item/stock_parts/gloves = null // Basic capacitor allows insulation, upgrades allow shock gloves etc.
var/attached_boots = 1 // Can't wear boots if some are attached
var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
var/attached_helmet = 1 // Can't wear a helmet if one is deployable.
var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any.
var/list/max_mounted_devices = 0 // Maximum devices. Easy.
var/list/can_mount = null // Types of device that can be hardpoint mounted.
var/list/mounted_devices = null // Holder for the above device.
var/obj/item/active_device = null // Currently deployed device, if any.
/obj/item/clothing/suit/space/hardsuit/equipped(mob/M)
/obj/item/clothing/suit/space/hardsuit/attack_self(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
..()
var/mob/living/carbon/human/H = M
if(!istype(H)) return
spawn(1) //to ensure the slot is set before we continue
if(H.wear_suit != src)
return
if(attached_helmet && helmet)
if(H.head)
to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.")
else
to_chat(M, "Your suit's helmet deploys with a hiss.")
//TODO: Species check, skull damage for forcing an unfitting helmet on?
helmet.forceMove(H)
H.equip_to_slot(helmet, slot_head)
helmet.flags |= NODROP
if(attached_boots && boots)
if(H.shoes)
to_chat(M, "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way.")
else
to_chat(M, "Your suit's boots deploy with a hiss.")
boots.forceMove(H)
H.equip_to_slot(boots, slot_shoes)
boots.flags |= NODROP
/obj/item/clothing/suit/space/hardsuit/dropped()
..()
var/mob/living/carbon/human/H
if(helmet)
H = helmet.loc
if(istype(H))
if(helmet && H.head == helmet)
helmet.flags &= ~NODROP
H.unEquip(helmet)
helmet.forceMove(src)
if(boots)
H = boots.loc
if(istype(H))
if(boots && H.shoes == boots)
boots.flags &= ~NODROP
H.unEquip(boots)
boots.forceMove(src)
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
..()
toggle_helmet()
/obj/item/clothing/suit/space/hardsuit/verb/toggle_helmet()
set name = "Toggle Helmet"
set category = "Object"
set src in usr
if(!isliving(usr))
return
if(!helmet)
to_chat(usr, "There is no helmet installed.")
return
var/mob/living/carbon/human/H = usr
if(!istype(H)) return
if(H.stat) return
if(H.wear_suit != src) return
if(H.head == helmet)
helmet.flags &= ~NODROP
H.unEquip(helmet)
helmet.loc = src
to_chat(H, "<span class='notice'>You retract your hardsuit helmet.</span>")
else
if(H.head)
to_chat(H, "<span class='warning'>You cannot deploy your helmet while wearing another helmet.</span>")
return
//TODO: Species check, skull damage for forcing an unfitting helmet on?
helmet.loc = H
helmet.pickup(H)
H.equip_to_slot(helmet, slot_head)
helmet.flags |= NODROP
to_chat(H, "<span class='notice'>You deploy your hardsuit helmet, sealing you off from the world.</span>")
H.update_inv_head()
/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/W, mob/user, params)
if(!isliving(user))
return
if(istype(W,/obj/item/screwdriver) && can_modify(user))
if(!helmet)
to_chat(user, "\The [src] does not have a helmet installed.")
else
to_chat(user, "You detach \the [helmet] from \the [src]'s helmet mount.")
helmet.loc = get_turf(src)
if(istype(helmet,/obj/item/clothing/head/helmet/space/hardsuit/syndi))
var/obj/item/clothing/head/helmet/space/hardsuit/syndi/S = helmet
S.linkedsuit = null
src.helmet = null
return
if(!boots)
to_chat(user, "\The [src] does not have any boots installed.")
else
to_chat(user, "You detach \the [boots] from \the [src]'s boot mounts.")
boots.loc = get_turf(src)
boots = null
return
else if(istype(W,/obj/item/clothing/head/helmet/space) && can_modify(user))
if(!attached_helmet)
to_chat(user, "\The [src] does not have a helmet mount.")
return
if(helmet)
to_chat(user, "\The [src] already has a helmet installed.")
else
to_chat(user, "You attach \the [W] to \the [src]'s helmet mount.")
user.drop_item()
W.loc = src
helmet = W
if(istype(helmet,/obj/item/clothing/head/helmet/space/hardsuit/syndi))
var/obj/item/clothing/head/helmet/space/hardsuit/syndi/S = W
S.forceMove(src)
helmet = S
S.link_suit()
return
else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user))
if(!attached_boots)
to_chat(user, "\The [src] does not have boot mounts.")
return
if(boots)
to_chat(user, "\The [src] already has magboots installed.")
else
to_chat(user, "You attach \the [W] to \the [src]'s boot mounts.")
user.drop_item()
W.loc = src
boots = W
else
return ..()
..()
/obj/item/clothing/suit/space/hardsuit/proc/can_modify(mob/living/user)
if(isliving(loc))
to_chat(user, "<span class='info'>You can not modify the hardsuit while it is being worn.</span>")
return 0
return 1
/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot)
if(slot == slot_wear_suit) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit.
return 1
//Engineering hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/engineering
/obj/item/clothing/head/helmet/space/hardsuit/engine
name = "engineering hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
item_color = "engineering"
/obj/item/clothing/suit/space/hardsuit/engineering
/obj/item/clothing/suit/space/hardsuit/engine
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd)
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
//Atmospherics
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
name = "atmospherics hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has thermal shielding."
icon_state = "hardsuit0-atmos"
item_state = "atmos_helm"
item_color = "atmos"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 25)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/hardsuit/engine/atmos
name = "atmospherics hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding."
icon_state = "hardsuit-atmos"
item_state = "atmo_hardsuit"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 25)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
//Chief Engineer's hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/elite
/obj/item/clothing/head/helmet/space/hardsuit/engine/elite
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "hardsuit0-white"
item_state = "ce_helm"
item_color = "white"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 100)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/hardsuit/elite
/obj/item/clothing/suit/space/hardsuit/engine/elite
icon_state = "hardsuit-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
@@ -301,6 +177,7 @@
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
//Mining hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/mining
@@ -309,16 +186,21 @@
icon_state = "hardsuit0-mining"
item_state = "mining_helm"
item_color = "mining"
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = HEAD
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
brightness_on = 7
/obj/item/clothing/suit/space/hardsuit/mining
icon_state = "hardsuit-mining"
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/pickaxe)
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/storage/bag/ore, /obj/item/pickaxe, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
//Syndicate hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi
@@ -332,48 +214,47 @@
on = 1
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDETAIL
visor_flags = STOPSPRESSUREDMAGE
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
/obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/link_suit()
. = ..()
if(istype(loc,/obj/item/clothing/suit/space/hardsuit/syndi))
/obj/item/clothing/head/helmet/space/hardsuit/syndi/New()
..()
if(istype(loc, /obj/item/clothing/suit/space/hardsuit/syndi))
linkedsuit = loc
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
if(!linkedsuit)
to_chat(user, "<span class='notice'>You must attach the helmet to a syndicate hardsuit to toggle combat mode!</span>")
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user) //Toggle Helmet
if(!isturf(user.loc))
to_chat(user, "<span class='warning'>You cannot toggle your helmet while in this [user.loc]!</span>" )
return
on = !on
if(on)
to_chat(user, "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
to_chat(user, "<span class='notice'>You switch your hardsuit to EVA mode, sacrificing speed for space protection.</span>")
name = initial(name)
desc = initial(desc)
set_light(brightness_on)
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
flags |= visor_flags
flags_cover |= HEADCOVERSEYES | HEADCOVERSMOUTH
flags_inv |= visor_flags_inv
cold_protection |= HEAD
else
to_chat(user, "<span class='notice'>You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.</span>")
name = "blood-red hardsuit helmet (combat)"
to_chat(user, "<span class='notice'>You switch your hardsuit to combat mode and can now run at full speed.</span>")
name += " (combat)"
desc = alt_desc
set_light(0)
flags = BLOCKHAIR | THICKMATERIAL | NODROP
flags &= ~visor_flags
flags_cover &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
flags_inv &= ~visor_flags_inv
cold_protection &= ~HEAD
update_icon()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
toggle_hardsuit_mode(user)
user.update_inv_head()
if(iscarbon(user))
var/mob/living/carbon/C = user
C.head_update(src, forced = 1)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
@@ -384,34 +265,19 @@
linkedsuit.name = initial(linkedsuit.name)
linkedsuit.desc = initial(linkedsuit.desc)
linkedsuit.slowdown = 1
linkedsuit.flags |= STOPSPRESSUREDMAGE | THICKMATERIAL
linkedsuit.flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
linkedsuit.flags |= STOPSPRESSUREDMAGE
linkedsuit.cold_protection |= UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
else
linkedsuit.name += " (combat)"
linkedsuit.desc = linkedsuit.alt_desc
linkedsuit.slowdown = 0
linkedsuit.flags = THICKMATERIAL
linkedsuit.flags &= ~STOPSPRESSUREDMAGE
linkedsuit.cold_protection &= ~(UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS)
linkedsuit.flags_inv &= ~(HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL)
linkedsuit.update_icon()
user.update_inv_wear_suit()
user.update_inv_w_uniform()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
name = "eagle helmet"
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom/update_icon()
return
/obj/item/clothing/suit/space/hardsuit/syndi
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
@@ -423,7 +289,8 @@
var/on = 1
actions_types = list(/datum/action/item_action/toggle_hardsuit_mode)
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
/obj/item/clothing/suit/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
@@ -437,36 +304,21 @@
armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
unacidable = TRUE
sprite_sheets = null
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/attack_self(mob/user)
..()
if(on)
name = "elite syndicate hardsuit helmet"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
else
name = "elite syndicate hardsuit helmet (combat)"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
/obj/item/clothing/suit/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode."
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
unacidable = TRUE
sprite_sheets = null
/obj/item/clothing/suit/space/hardsuit/syndi/elite/attack_self(mob/user)
..()
if(on)
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
else
name = "elite syndicate hardsuit (combat)"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
//Strike team hardsuits
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100) //Almost as good as DS gear, but unlike DS can switch to combat for mobility
@@ -477,16 +329,29 @@
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100)
icon_state = "hardsuit0-sst"
item_color = "sst"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst
/obj/item/clothing/suit/space/hardsuit/syndi/freedom
name = "eagle suit"
desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit."
icon_state = "freedom"
item_state = "freedom"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
sprite_sheets = null
/obj/item/clothing/suit/space/hardsuit/syndi/freedom/update_icon()
return
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
name = "eagle helmet"
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
sprite_sheets = null
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom/update_icon()
return
//Wizard hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/wizard
name = "gem-encrusted hardsuit helmet"
@@ -515,6 +380,7 @@
allowed = list(/obj/item/teleportation_scroll,/obj/item/tank)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard
sprite_sheets = null
magical = TRUE
@@ -525,9 +391,9 @@
icon_state = "hardsuit0-medical"
item_state = "medical_helm"
item_color = "medical"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
flash_protect = 0
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
scan_reagents = 1 //Generally worn by the CMO, so they'd get utility off of seeing reagents
/obj/item/clothing/suit/space/hardsuit/medical
@@ -536,7 +402,9 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/firstaid,/obj/item/healthanalyzer,/obj/item/stack/medical,/obj/item/rad_laser)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical
slowdown = 0.5
//Security
/obj/item/clothing/head/helmet/space/hardsuit/security
@@ -545,36 +413,32 @@
icon_state = "hardsuit0-sec"
item_state = "sec_helm"
item_color = "sec"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
armor = list(melee = 35, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/hardsuit/security
icon_state = "hardsuit-sec"
name = "security hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
armor = list(melee = 35, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/baton,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/restraints/handcuffs)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security
/obj/item/clothing/head/helmet/space/hardsuit/security/hos
name = "head of security's hardsuit helmet"
desc = "a special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
icon_state = "hardsuit0-hos"
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
sprite_sheets = null
//Atmospherics hardsuit (BS12)
/obj/item/clothing/head/helmet/space/hardsuit/atmos
desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
name = "atmospherics hardsuit helmet"
icon_state = "hardsuit0-atmos"
item_state = "atmos_helm"
item_color = "atmos"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/hardsuit/atmos
desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
icon_state = "hardsuit-atmos"
name = "atmos hardsuit"
item_state = "atmos_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/hardsuit/security/hos
name = "head of security's hardsuit"
desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
icon_state = "hardsuit-hos"
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
sprite_sheets = null
//Singuloth armor
/obj/item/clothing/head/helmet/space/hardsuit/singuloth
@@ -584,6 +448,7 @@
item_state = "singuloth_helm"
item_color = "singuloth"
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
sprite_sheets = null
/obj/item/clothing/suit/space/hardsuit/singuloth
icon_state = "hardsuit-singuloth"
@@ -591,22 +456,8 @@
desc = "This is a ceremonial armor from the chapter of the Singuloth Knights. It's made of pure forged adamantium."
item_state = "singuloth_hardsuit"
flags = STOPSPRESSUREDMAGE
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
/obj/item/clothing/head/helmet/space/hardsuit/security/hos
name = "head of security's hardsuit helmet"
desc = "a special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
icon_state = "hardsuit0-hos"
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
/obj/item/clothing/suit/space/hardsuit/security/hos
icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 100)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/singuloth
sprite_sheets = null
@@ -616,6 +467,7 @@
name = "shielded hardsuit"
desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
icon_state = "hardsuit-hos"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
allowed = list(/obj/item/flashlight,/obj/item/tank, /obj/item/gun,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
var/current_charges = 3
@@ -669,6 +521,7 @@
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
slowdown = 0
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+237 -414
View File
@@ -1,427 +1,250 @@
// PLASMEN SHIT
// CAN'T WEAR UNLESS YOU'RE A PINK SKELETON
/obj/item/clothing/suit/space/eva/plasmaman
name = "plasmaman suit"
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
slowdown = 0
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
icon = 'icons/obj/clothing/species/plasmaman/suits.dmi'
species_restricted = list("Plasmaman")
sprite_sheets = list(
"Plasmaman" = 'icons/mob/species/plasmaman/suit.dmi'
)
flags = STOPSPRESSUREDMAGE
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish = 0
var/extinguish_cooldown = 10 SECONDS
var/max_extinguishes = 5
var/extinguishes_left = 5 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
var/mob/living/carbon/human/H=user
if(extinguishes_left)
if(next_extinguish > world.time)
return
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
to_chat(user, "<span class='warning'>You hear a soft click and a hiss from your suit as it automatically extinguishes the fire.</span>")
if(!extinguishes_left)
to_chat(user, "<span class='warning'>Onboard auto-extinguisher depleted, refill with a cartridge.</span>")
playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
H.ExtinguishMob()
/obj/item/clothing/suit/space/eva/plasmaman/attackby(var/obj/item/A as obj, mob/user as mob, params)
..()
if(istype(A, /obj/item/plasmensuit_cartridge)) //This suit can only be reloaded by the appropriate cartridges, and only if it's got no more extinguishes left.
if(!extinguishes_left)
extinguishes_left = max_extinguishes //Full replenishment from the cartridge.
to_chat(user, "<span class='notice'>You replenish \the [src] with the cartridge.</span>")
qdel(A)
else
to_chat(user, "<span class='notice'>The suit must be depleted before it can be refilled.</span>")
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..(user)
to_chat(user, "<span class='info'>There are [extinguishes_left] extinguisher canisters left in this suit.</span>")
/obj/item/plasmensuit_cartridge //Can be used to refill Plasmaman suits when they run out of autoextinguishes.
name = "auto-extinguisher cartridge"
desc = "A tiny and light fibreglass-framed auto-extinguisher cartridge."
icon = 'icons/obj/items.dmi'
icon_state = "miniFE0"
item_state = "miniFE"
hitsound = null //Ultralight and
flags = null //non-conductive
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_SMALL //Fits in boxes.
materials = list()
attack_verb = list("tapped")
/obj/item/clothing/head/helmet/space/eva/plasmaman
name = "plasmaman helmet"
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
flags = STOPSPRESSUREDMAGE
//I just want the light feature of the hardsuit helmet
/obj/item/clothing/head/helmet/space/plasmaman
name = "plasma envirosuit helmet"
desc = "A special containment helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment. It is space-worthy, and may be worn in tandem with other EVA gear."
icon_state = "plasmaman-helm"
item_state = "plasmaman-helm"
strip_delay = 80
flash_protect = 2
tint = 2
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
resistance_flags = FIRE_PROOF
var/brightness_on = 4 //luminosity when the light is on
var/on = FALSE
var/smile = FALSE
var/smile_color = "#FF0000"
var/visor_icon = "envisor"
var/smile_state = "envirohelm_smile"
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen/plasmaman)
visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES
visor_flags_inv = HIDEEYES|HIDEFACE
icon = 'icons/obj/clothing/species/plasmaman/hats.dmi'
species_restricted = list("Plasmaman")
sprite_sheets = list(
"Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi'
)
icon_state = "plasmaman_helmet0"
item_state = "plasmaman_helmet0"
var/base_state = "plasmaman_helmet"
var/brightness_on = 4 //luminosity when on
var/on = 0
sprite_sheets = list("Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi')
/obj/item/clothing/head/helmet/space/plasmaman/New()
..()
visor_toggling()
update_icon()
cut_overlays()
/obj/item/clothing/head/helmet/space/plasmaman/AltClick(mob/user)
if(!user.incapacitated() && Adjacent(user))
toggle_welding_screen(user)
/obj/item/clothing/head/helmet/space/plasmaman/visor_toggling() //handles all the actual toggling of flags
up = !up
flags ^= visor_flags
flags_inv ^= visor_flags_inv
icon_state = "[initial(icon_state)]"
if(visor_vars_to_toggle & VISOR_FLASHPROTECT)
flash_protect ^= initial(flash_protect)
if(visor_vars_to_toggle & VISOR_TINT)
tint ^= initial(tint)
/obj/item/clothing/head/helmet/space/plasmaman/proc/toggle_welding_screen(mob/living/user)
if(weldingvisortoggle(user))
if(on)
to_chat(user, "<span class='notice'>Your helmet's torch can't pass through your welding visor!</span>")
on = FALSE
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
update_icon()
else
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
update_icon()
/obj/item/clothing/head/helmet/space/plasmaman/update_icon()
cut_overlays()
add_overlay(visor_icon)
..()
actions_types = list(/datum/action/item_action/toggle_helmet_light)
/obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user)
toggle_light(user)
/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user)
/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user)
on = !on
icon_state = "[base_state][on]"
icon_state = "[initial(icon_state)][on ? "-light":""]"
item_state = icon_state
user.update_inv_head() //So the mob overlay updates
if(on)
set_light(brightness_on)
if(!up)
to_chat(user, "<span class='notice'>Your helmet's torch can't pass through your welding visor!</span>")
set_light(0)
else
set_light(brightness_on)
else
set_light(0)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
for(var/X in actions)
var/datum/action/A = X
var/datum/action/A=X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/eva/plasmaman/extinguish_light()
if(on)
toggle_light()
visible_message("<span class='danger'>[src]'s light fades and turns off.</span>")
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric suit"
icon_state = "plasmamanAtmos_suit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric helmet"
icon_state = "plasmamanAtmos_helmet0"
base_state = "plasmamanAtmos_helmet"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
flash_protect = 2
/obj/item/clothing/suit/space/eva/plasmaman/engineer
name = "plasmaman engineer suit"
icon_state = "plasmamanEngineer_suit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
name = "plasmaman engineer helmet"
icon_state = "plasmamanEngineer_helmet0"
base_state = "plasmamanEngineer_helmet"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
flash_protect = 2
/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer suit"
icon_state = "plasmaman_CE"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer helmet"
icon_state = "plasmaman_CE_helmet0"
base_state = "plasmaman_CE_helmet"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
flash_protect = 2
//SERVICE
/obj/item/clothing/suit/space/eva/plasmaman/assistant
name = "plasmaman assistant suit"
icon_state = "plasmamanAssistant_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
name = "plasmaman assistant helmet"
icon_state = "plasmamanAssistant_helmet0"
base_state = "plasmamanAssistant_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/botanist
name = "plasmaman botanist suit"
icon_state = "plasmamanBotanist_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
name = "plasmaman botanist helmet"
icon_state = "plasmamanBotanist_helmet0"
base_state = "plasmamanBotanist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/chaplain
name = "plasmaman chaplain suit"
icon_state = "plasmamanChaplain_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
name = "plasmaman chaplain helmet"
icon_state = "plasmamanChaplain_helmet0"
base_state = "plasmamanChaplain_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/clown
name = "plasmaman clown suit"
icon_state = "plasmaman_Clown"
/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
name = "plasmaman clown helmet"
icon_state = "plasmaman_Clown_helmet0"
base_state = "plasmaman_Clown_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/mime
name = "plasmaman mime suit"
icon_state = "plasmaman_Mime"
/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
name = "plasmaman mime helmet"
icon_state = "plasmaman_Mime_helmet0"
base_state = "plasmaman_Mime_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/service
name = "plasmaman service suit"
icon_state = "plasmamanService_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/service
name = "plasmaman service helmet"
icon_state = "plasmamanService_helmet0"
base_state = "plasmamanService_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/janitor
name = "plasmaman janitor suit"
icon_state = "plasmamanJanitor_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
name = "plasmaman janitor helmet"
icon_state = "plasmamanJanitor_helmet0"
base_state = "plasmamanJanitor_helmet"
//CARGO
/obj/item/clothing/suit/space/eva/plasmaman/cargo
name = "plasmaman cargo suit"
icon_state = "plasmamanCargo_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
name = "plasmaman cargo helmet"
icon_state = "plasmamanCargo_helmet0"
base_state = "plasmamanCargo_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/miner
name = "plasmaman miner suit"
icon_state = "plasmamanMiner_suit"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
slowdown = 1
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
name = "plasmaman miner helmet"
icon_state = "plasmamanMiner_helmet0"
base_state = "plasmamanMiner_helmet"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/eva/plasmaman/explorer
name = "plasmaman explorer suit"
icon_state = "plasmamanExplorer_suit"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
name = "plasmaman explorer helmet"
icon_state = "plasmamanExplorer_helmet0"
base_state = "plasmamanExplorer_helmet"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
// MEDSCI
/obj/item/clothing/suit/space/eva/plasmaman/medical
name = "plasmaman medical suit"
icon_state = "plasmamanMedical_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
name = "plasmaman medical helmet"
icon_state = "plasmamanMedical_helmet0"
base_state = "plasmamanMedical_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
name = "plasmaman paramedic suit"
icon_state = "plasmaman_Paramedic"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
name = "plasmaman paramedic helmet"
icon_state = "plasmaman_Paramedic_helmet0"
base_state = "plasmaman_Paramedic_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
name = "plasmaman chemist suit"
icon_state = "plasmaman_Chemist"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
name = "plasmaman chemist helmet"
icon_state = "plasmaman_Chemist_helmet0"
base_state = "plasmaman_Chemist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
name = "plasmaman chief medical officer suit"
icon_state = "plasmaman_CMO"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
name = "plasmaman chief medical officer helmet"
icon_state = "plasmaman_CMO_helmet0"
base_state = "plasmaman_CMO_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
name = "plasmaman coroner suit"
icon_state = "plasmaman_Coroner"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
name = "plasmaman coroner helmet"
icon_state = "plasmaman_Coroner_helmet0"
base_state = "plasmaman_Coroner_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
name = "plasmaman virologist suit"
icon_state = "plasmaman_Virologist"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
name = "plasmaman virologist helmet"
icon_state = "plasmaman_Virologist_helmet0"
base_state = "plasmaman_Virologist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science
name = "plasmaman scientist suit"
icon_state = "plasmamanScience_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science
name = "plasmaman scientist helmet"
icon_state = "plasmamanScience_helmet0"
base_state = "plasmamanScience_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
name = "plasmaman geneticist suit"
icon_state = "plasmaman_Geneticist"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
name = "plasmaman geneticist helmet"
icon_state = "plasmaman_Geneticist_helmet0"
base_state = "plasmaman_Geneticist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science/rd
name = "plasmaman research director suit"
icon_state = "plasmaman_RD"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
name = "plasmaman research director helmet"
icon_state = "plasmaman_RD_helmet0"
base_state = "plasmaman_RD_helmet"
//MAGISTRATE
/obj/item/clothing/suit/space/eva/plasmaman/magistrate
name = "plasmaman magistrate suit"
icon_state = "plasmaman_HoS"
/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
name = "plasmaman magistrate helmet"
icon_state = "plasmaman_HoS_helmet0"
base_state = "plasmaman_HoS_helmet"
//NT REP
/obj/item/clothing/suit/space/eva/plasmaman/nt_rep
name = "plasmaman NT representative suit"
icon_state = "plasmaman_rep"
/obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
name = "plasmaman NT representative helmet"
icon_state = "plasmaman_rep_helmet0"
base_state = "plasmaman_rep_helmet"
//SECURITY
/obj/item/clothing/suit/space/eva/plasmaman/security
name = "plasmaman security suit"
icon_state = "plasmamanSecurity_suit"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/security
name = "plasmaman security helmet"
icon_state = "plasmamanSecurity_helmet0"
base_state = "plasmamanSecurity_helmet"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/eva/plasmaman/security/hos
name = "plasmaman head of security suit"
icon_state = "plasmaman_HoS"
/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
name = "plasmaman head of security helmet"
icon_state = "plasmaman_HoS_helmet0"
base_state = "plasmaman_HoS_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/security/hop
name = "plasmaman head of personnel suit"
icon_state = "plasmaman_HoP"
/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
name = "plasmaman head of personnel helmet"
icon_state = "plasmaman_HoP_helmet0"
base_state = "plasmaman_HoP_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/security/captain
name = "plasmaman captain suit"
icon_state = "plasmaman_Captain"
/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
name = "plasmaman captain helmet"
icon_state = "plasmaman_Captain_helmet0"
base_state = "plasmaman_Captain_helmet"
//IAA/LAWYER
/obj/item/clothing/suit/space/eva/plasmaman/lawyer
name = "plasmaman lawyer suit"
icon_state = "plasmamanlawyer_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
name = "plasmaman lawyer helmet"
icon_state = "plasmamanlawyer_helmet0"
base_state = "plasmamanlawyer_helmet"
//NUKEOPS
/obj/item/clothing/suit/space/eva/plasmaman/nuclear
name = "blood red plasmaman suit"
icon_state = "plasmaman_Nukeops"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs)
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
name = "blood red plasmaman helmet"
icon_state = "plasmaman_Nukeops_helmet0"
base_state = "plasmaman_Nukeops_helmet"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
//WIZARD
/obj/item/clothing/suit/space/eva/plasmaman/wizard
name = "robed plasmaman suit"
icon_state = "plasmamanWizardBlue_suit"
magical = TRUE
/obj/item/clothing/head/helmet/space/eva/plasmaman/wizard
name = "wizard hat"
icon_state = "plasmamanWizardBlue_helmet0"
base_state = "plasmamanWizardBlue_helmet"
magical = TRUE
/obj/item/clothing/head/helmet/space/plasmaman/security
name = "security plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
icon_state = "security_envirohelm"
item_state = "security_envirohelm"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
/obj/item/clothing/head/helmet/space/plasmaman/security/warden
name = "warden's plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirohelm"
item_state = "warden_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/security/hos
name = "security plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for the head of security."
icon_state = "hos_envirohelm"
item_state = "hos_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/medical
name = "medical's plasma envirosuit helmet"
desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much"
icon_state = "doctor_envirohelm"
item_state = "doctor_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/cmo
name = "chief medical officer's plasma envirosuit helmet"
desc = "An envriohelmet designed for plasmaman employed as the cheif medical officer."
icon_state = "cmo_envirohelm"
item_state = "cmo_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/genetics
name = "geneticist's plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for geneticists."
icon_state = "geneticist_envirohelm"
item_state = "geneticist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/viro
name = "virology plasma envirosuit helmet"
desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create."
icon_state = "virologist_envirohelm"
item_state = "virologist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/chemist
name = "chemistry plasma envirosuit helmet"
desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face."
icon_state = "chemist_envirohelm"
item_state = "chemist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/science
name = "science plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for scientists."
icon_state = "scientist_envirohelm"
item_state = "scientist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/rd
name = "research director plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for the research director."
icon_state = "rd_envirohelm"
item_state = "rd_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/robotics
name = "robotics plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for roboticists."
icon_state = "roboticist_envirohelm"
item_state = "roboticist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/engineering
name = "engineering plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
icon_state = "engineer_envirohelm"
item_state = "engineer_envirohelm"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 10)
/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for chief engineer employed plasmamen."
icon_state = "ce_envirohelm"
item_state = "ce_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/atmospherics
name = "atmospherics plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue."
icon_state = "atmos_envirohelm"
item_state = "atmos_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/cargo
name = "cargo plasma envirosuit helmet"
desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters."
icon_state = "cargo_envirohelm"
item_state = "cargo_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/mining
name = "mining plasma envirosuit helmet"
desc = "A khaki helmet given to plasmamen miners operating on lavaland."
icon_state = "explorer_envirohelm"
item_state = "explorer_envirohelm"
visor_icon = "explorer_envisor"
/obj/item/clothing/head/helmet/space/plasmaman/chaplain
name = "chaplain's plasma envirosuit helmet"
desc = "An envirohelmet specially designed for only the most pious of plasmamen."
icon_state = "chap_envirohelm"
item_state = "chap_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/white
name = "white plasma envirosuit helmet"
desc = "A generic white envirohelm."
icon_state = "white_envirohelm"
item_state = "white_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/chef
name = "chef plasma envirosuit helmet"
desc = "An envirohelm designed for plasmamen chefs."
icon_state = "chef_envirohelm"
item_state = "chef_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/librarian
name = "librarian's plasma envirosuit helmet"
desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
icon_state = "prototype_envirohelm"
item_state = "prototype_envirohelm"
actions_types = list(/datum/action/item_action/toggle_welding_screen/plasmaman)
visor_icon = "prototype_envisor"
/obj/item/clothing/head/helmet/space/plasmaman/botany
name = "botany plasma envirosuit helmet"
desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries."
icon_state = "botany_envirohelm"
item_state = "botany_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/janitor
name = "janitor's plasma envirosuit helmet"
desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor."
icon_state = "janitor_envirohelm"
item_state = "janitor_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/mime
name = "mime envirosuit helmet"
desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful."
icon_state = "mime_envirohelm"
item_state = "mime_envirohelm"
visor_icon = "mime_envisor"
/obj/item/clothing/head/helmet/space/plasmaman/clown
name = "clown envirosuit helmet"
desc = "The make-up is painted on, it's a miracle it doesn't chip. <i>'HONK!'</i>"
icon_state = "clown_envirohelm"
item_state = "clown_envirohelm"
visor_icon = "clown_envisor"
/obj/item/clothing/head/helmet/space/plasmaman/hop
name = "head of personnel envirosuit helmet"
desc = "A plasmaman envirohelm that reeks of bureaucracy."
icon_state = "hop_envirohelm"
item_state = "hop_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/captain
name = "captain envirosuit helmet"
desc = "A plasmaman envirohelm designed with the insignia and markings befitting a captain."
icon_state = "cap_envirohelm"
item_state = "cap_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/blueshield
name = "blueshield envirosuit helmet"
desc = "A plasmaman envirohelm designed for the blueshield."
icon_state = "bs_envirohelm"
item_state = "bs_envirohelm"
@@ -56,7 +56,7 @@
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
device_type = /obj/item/pickaxe/diamonddrill
device_type = /obj/item/pickaxe/drill/diamonddrill
/obj/item/rig_module/device/orescanner
name = "ore scanner module"
+6 -5
View File
@@ -527,14 +527,15 @@
icon_state = "bonearmor"
item_state = "bonearmor"
blood_overlay_type = "armor"
armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
armor = list(melee = 35, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
/obj/item/clothing/head/skullhelmet
/obj/item/clothing/head/helmet/skull
name = "skull helmet"
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES
armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20)
armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20)
icon_state = "skull"
item_state = "skull"
item_state = "skull"
strip_delay = 100
+76
View File
@@ -0,0 +1,76 @@
//Hardsuit toggle code
/obj/item/clothing/suit/space/hardsuit/New()
MakeHelmet()
..()
/obj/item/clothing/suit/space/hardsuit/Destroy()
if(helmet)
helmet.suit = null
qdel(helmet)
return ..()
/obj/item/clothing/head/helmet/space/hardsuit/Destroy()
if(suit)
suit.helmet = null
return ..()
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
if(!helmettype)
return
if(!helmet)
var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src)
W.suit = src
helmet = W
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
..()
ToggleHelmet()
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
if(!helmettype)
return
if(slot != slot_wear_suit)
RemoveHelmet()
..()
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
if(!helmet)
return
suittoggled = FALSE
if(ishuman(helmet.loc))
var/mob/living/carbon/H = helmet.loc
if(helmet.on)
helmet.attack_self(H)
H.unEquip(helmet, TRUE)
helmet.forceMove(src)
H.update_inv_wear_suit()
to_chat(H, "<span class='notice'>The helmet on the hardsuit disengages.</span>")
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
else
helmet.forceMove(src)
/obj/item/clothing/suit/space/hardsuit/dropped()
..()
RemoveHelmet()
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
var/mob/living/carbon/human/H = src.loc
if(!helmettype)
return
if(!helmet)
return
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
to_chat(H, "<span class='warning'>You must be wearing [src] to engage the helmet!</span>")
return
if(H.head)
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
return
else if(H.equip_to_slot_if_possible(helmet, slot_head, 0 ,0, 1))
to_chat(H, "<span class='notice'>You engage the helmet on the hardsuit.</span>")
suittoggled = TRUE
H.update_inv_wear_suit()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
else
RemoveHelmet()
@@ -0,0 +1,55 @@
/obj/item/clothing/under/plasmaman
name = "plasma envirosuit"
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
strip_delay = 80
var/next_extinguish = 0
var/extinguish_cooldown = 100
var/extinguishes_left = 5
icon = 'icons/obj/clothing/species/plasmaman/uniform.dmi'
species_restricted = list("Plasmaman")
sprite_sheets = list("Plasmaman" = 'icons/mob/species/plasmaman/uniform.dmi')
icon_state = "plasmaman"
item_state = "plasmaman"
item_color = "plasmaman"
/obj/item/clothing/under/plasmaman/examine(mob/user)
..()
to_chat(user, "<span class='notice'>There are [extinguishes_left] extinguisher charges left in this suit.</span>")
/obj/item/clothing/under/plasmaman/proc/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
return
if(H.on_fire)
if(extinguishes_left)
if(next_extinguish > world.time)
return
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
H.visible_message("<span class='warning'>[H]'s suit automatically extinguishes [H.p_them()]!</span>","<span class='warning'>Your suit automatically extinguishes you.</span>")
if(!extinguishes_left)
to_chat(H, "<span class='warning'>Onboard auto-extinguisher depleted, refill with a cartridge.</span>")
playsound(H.loc, 'sound/effects/spray.ogg', 10, 1, -3)
H.ExtinguishMob()
new /obj/effect/particle_effect/water(get_turf(H))
return FALSE
/obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params)
if (istype(E, /obj/item/extinguisher_refill))
if (extinguishes_left == 5)
to_chat(user, "<span class='notice'>The inbuilt extinguisher is full.</span>")
return
else
extinguishes_left = 5
to_chat(user, "<span class='notice'>You refill the suit's built-in extinguisher, using up the cartridge.</span>")
qdel(E)
else
return ..()
/obj/item/extinguisher_refill
name = "envirosuit extinguisher cartridge"
desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits."
icon_state = "plasmarefill"
icon = 'icons/obj/device.dmi'
@@ -0,0 +1,107 @@
/obj/item/clothing/under/plasmaman/cargo
name = "cargo plasma envirosuit"
desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs."
icon_state = "cargo_envirosuit"
item_state = "cargo_envirosuit"
item_color = "cargo_envirosuit"
/obj/item/clothing/under/plasmaman/mining
name = "mining plasma envirosuit"
desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen."
icon_state = "explorer_envirosuit"
item_state = "explorer_envirosuit"
item_color = "explorer_envirosuit"
/obj/item/clothing/under/plasmaman/chef
name = "chef's plasma envirosuit"
desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef."
icon_state = "chef_envirosuit"
item_state = "chef_envirosuit"
item_color = "chef_envirosuit"
/obj/item/clothing/under/plasmaman/enviroslacks
name = "enviroslacks"
desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike."
icon_state = "enviroslacks"
item_state = "enviroslacks"
item_color = "enviroslacks"
/obj/item/clothing/under/plasmaman/chaplain
name = "chaplain's plasma envirosuit"
desc = "An envirosuit specially designed for only the most pious of plasmamen."
icon_state = "chap_envirosuit"
item_state = "chap_envirosuit"
item_color = "chap_envirosuit"
/obj/item/clothing/under/plasmaman/librarian
name = "librarian's plasma envirosuit"
desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike."
icon_state = "prototype_envirosuit"
item_state = "prototype_envirosuit"
item_color = "prototype_envirosuit"
/obj/item/clothing/under/plasmaman/janitor
name = "janitor's plasma envirosuit"
desc = "A grey and purple envirosuit designated for plasmamen janitors."
icon_state = "janitor_envirosuit"
item_state = "janitor_envirosuit"
item_color = "janitor_envirosuit"
/obj/item/clothing/under/plasmaman/botany
name = "botany envirosuit"
desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries."
icon_state = "botany_envirosuit"
item_state = "botany_envirosuit"
item_color = "botany_envirosuit"
/obj/item/clothing/under/plasmaman/mime
name = "mime envirosuit"
desc = "It's not very colourful."
icon_state = "mime_envirosuit"
item_state = "mime_envirosuit"
item_color = "mime_envirosuit"
/obj/item/clothing/under/plasmaman/clown
name = "clown envirosuit"
desc = "<i>'HONK!'</i>"
icon_state = "clown_envirosuit"
item_state = "clown_envirosuit"
item_color = "clown_envirosuit"
/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
return
if(H.on_fire)
if(extinguishes_left)
if(next_extinguish > world.time)
return
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
H.visible_message("<span class='warning'>[H]'s suit spews out a tonne of space lube!</span>", "<span class='warning'>Your suit spews out a tonne of space lube!</span>")
H.ExtinguishMob()
new /obj/effect/particle_effect/foam(loc) //Truely terrifying.
return FALSE
/obj/item/clothing/under/plasmaman/hop
name = "head of personnel envirosuit"
desc = "An envirosuit designed for plasmamen employed as the head of personnel."
icon_state = "hop_envirosuit"
item_state = "hop_envirosuit"
item_color = "hop_envirosuit"
/obj/item/clothing/under/plasmaman/captain
name = "captain envirosuit"
desc = "An envirosuit designed for plasmamen employed as the captain."
icon_state = "cap_envirosuit"
item_state = "cap_envirosuit"
item_color = "cap_envirosuit"
/obj/item/clothing/under/plasmaman/blueshield
name = "blueshield envirosuit"
desc = "An envirosuit designed for plasmamen employed as the blueshield."
icon_state = "bs_envirosuit"
item_state = "bs_envirosuit"
item_color = "bs_envirosuit"
@@ -0,0 +1,22 @@
/obj/item/clothing/under/plasmaman/engineering
name = "engineering plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
icon_state = "engineer_envirosuit"
item_state = "engineer_envirosuit"
item_color = "engineer_envirosuit"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 10)
/obj/item/clothing/under/plasmaman/engineering/ce
name = "chief engineer plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as the chief engineer"
icon_state = "ce_envirosuit"
item_state = "ce_envirosuit"
item_color = "ce_envirosuit"
/obj/item/clothing/under/plasmaman/atmospherics
name = "atmospherics plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue."
icon_state = "atmos_envirosuit"
item_state = "atmos_envirosuit"
item_color = "atmos_envirosuit"
@@ -0,0 +1,55 @@
/obj/item/clothing/under/plasmaman/medical
name = "medical plasma envirosuit"
desc = "A suit designed for the station's more plasma-based doctors."
icon_state = "doctor_envirosuit"
item_state = "doctor_envirosuit"
item_color = "doctor_envirosuit"
/obj/item/clothing/under/plasmaman/cmo
name = "cmo plasma envirosuit"
desc = "A suit designed for the station's more plasma-based chief medical officer."
icon_state = "cmo_envirosuit"
item_state = "cmo_envirosuit"
item_color = "cmo_envirosuit"
/obj/item/clothing/under/plasmaman/science
name = "science plasma envirosuit"
desc = "A plasmaman envirosuit designed for scientists."
icon_state = "scientist_envirosuit"
item_state = "scientist_envirosuit"
item_color = "scientist_envirosuit"
/obj/item/clothing/under/plasmaman/rd
name = "science plasma envirosuit"
desc = "A plasmaman envirosuit designed for the research director."
icon_state = "rd_envirosuit"
item_state = "rd_envirosuit"
item_color = "rd_envirosuit"
/obj/item/clothing/under/plasmaman/robotics
name = "robotics plasma envirosuit"
desc = "A plasmaman envirosuit designed for roboticists."
icon_state = "roboticist_envirosuit"
item_state = "roboticist_envirosuit"
item_color = "roboticist_envirosuit"
/obj/item/clothing/under/plasmaman/viro
name = "virology plasma envirosuit"
desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create."
icon_state = "virologist_envirosuit"
item_state = "virologist_envirosuit"
item_color = "virologist_envirosuit"
/obj/item/clothing/under/plasmaman/genetics
name = "genetics plasma envirosuit"
desc = "A plasmaman envirosuit designed for geneticists."
icon_state = "geneticist_envirosuit"
item_state = "geneticist_envirosuit"
item_color = "geneticist_envirosuit"
/obj/item/clothing/under/plasmaman/chemist
name = "chemistry plasma envirosuit"
desc = "A plasmaman envirosuit designed for chemists."
icon_state = "chemist_envirosuit"
item_state = "chemist_envirosuit"
item_color = "chemist_envirosuit"
@@ -0,0 +1,21 @@
/obj/item/clothing/under/plasmaman/security
name = "security plasma envirosuit"
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
icon_state = "security_envirosuit"
item_state = "security_envirosuit"
item_color = "security_envirosuit"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
/obj/item/clothing/under/plasmaman/security/warden
name = "warden plasma envirosuit"
desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirosuit"
item_state = "warden_envirosuit"
item_color = "warden_envirosuit"
/obj/item/clothing/under/plasmaman/security/hos
name = "head of security plasma envirosuit"
desc = "A plasmaman containment suit designed for the head of security."
icon_state = "hos_envirosuit"
item_state = "hos_envirosuit"
item_color = "hos_envirosuit"
+70 -41
View File
@@ -385,42 +385,11 @@
)
category = CAT_WEAPON
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60
reqs = list(/obj/item/grown/log = 5)
result = /obj/structure/bonfire
category = CAT_PRIMAL
/datum/crafting_recipe/boneaxe
name = "Bone Axe"
result = /obj/item/twohanded/fireaxe/boneaxe
time = 50
reqs = list(/obj/item/stack/sheet/bone = 6,
/obj/item/stack/sheet/sinew = 3)
category = CAT_PRIMAL
/datum/crafting_recipe/bonespear
name = "Bone Spear"
result = /obj/item/twohanded/spear/bonespear
/datum/crafting_recipe/bonearmor
name = "Bone Armor"
result = /obj/item/clothing/suit/armor/bone
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bonedagger
name = "Bone Dagger"
result = /obj/item/kitchen/knife/combat/survival/bone
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/bonecodpiece
name = "Skull Codpiece"
result = /obj/item/clothing/accessory/necklace/skullcodpiece
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
reqs = list(/obj/item/stack/sheet/bone = 6)
category = CAT_PRIMAL
/datum/crafting_recipe/bonetalisman
@@ -431,16 +400,25 @@
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bonearmor
name = "Bone Armor"
result = /obj/item/clothing/suit/armor/bone
time = 30
reqs = list(/obj/item/stack/sheet/bone = 6)
/datum/crafting_recipe/bonecodpiece
name = "Skull Codpiece"
result = /obj/item/clothing/accessory/necklace/skullcodpiece
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bracers
name = "Bone Bracers"
result = /obj/item/clothing/gloves/bracer
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/skullhelm
name = "Skull Helmet"
result = /obj/item/clothing/head/skullhelmet
result = /obj/item/clothing/head/helmet/skull
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4)
category = CAT_PRIMAL
@@ -463,6 +441,13 @@
/obj/item/stack/sheet/animalhide/ashdrake = 5)
category = CAT_PRIMAL
/datum/crafting_recipe/firebrand
name = "Firebrand"
result = /obj/item/match/firebrand
time = 100 //Long construction time. Making fire is hard work.
reqs = list(/obj/item/stack/sheet/wood = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/tribal_splint
name = "Tribal Splint"
time = 20
@@ -471,6 +456,50 @@
result = /obj/item/stack/medical/splint/tribal
category = CAT_PRIMAL
/datum/crafting_recipe/bonedagger
name = "Bone Dagger"
result = /obj/item/kitchen/knife/combat/survival/bone
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/bonespear
name = "Bone Spear"
result = /obj/item/twohanded/spear/bonespear
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/boneaxe
name = "Bone Axe"
result = /obj/item/twohanded/fireaxe/boneaxe
time = 50
reqs = list(/obj/item/stack/sheet/bone = 6,
/obj/item/stack/sheet/sinew = 3)
category = CAT_PRIMAL
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60
reqs = list(/obj/item/grown/log = 5)
result = /obj/structure/bonfire
category = CAT_PRIMAL
/datum/crafting_recipe/rake //Category resorting incoming
name = "Rake"
time = 30
reqs = list(/obj/item/stack/sheet/wood = 5)
result = /obj/item/cultivator/rake
category = CAT_PRIMAL
/datum/crafting_recipe/woodbucket
name = "Wooden Bucket"
time = 30
reqs = list(/obj/item/stack/sheet/wood = 3)
result = /obj/item/reagent_containers/glass/bucket/wooden
category = CAT_PRIMAL
/datum/crafting_recipe/guillotine
name = "Guillotine"
result = /obj/structure/guillotine
+3 -112
View File
@@ -10,6 +10,9 @@
////////// Usable Items //////////
//////////////////////////////////
#define USED_MOD_HELM 1
#define USED_MOD_SUIT 2
/obj/item/fluff
var/used = 0
@@ -401,118 +404,6 @@
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
#define USED_MOD_HELM 1
#define USED_MOD_SUIT 2
/obj/item/fluff/shadey_plasman_modkit
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
/obj/item/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
if(used & USED_MOD_HELM)
to_chat(H, "<span class='notice'>The kit's helmet modifier has already been used.</span>")
return
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
used |= USED_MOD_HELM
var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
P.name = "plasma containment helmet"
P.desc = "A purpose-built containment helmet designed to keep plasma in, and everything else out."
P.icon_state = "plasmaman_halo_helmet[P.on]"
P.base_state = "plasmaman_halo_helmet"
if(P == H.head)
H.update_inv_head()
return
if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
if(used & USED_MOD_SUIT)
to_chat(user, "<span class='notice'>The kit's suit modifier has already been used.</span>")
return
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
used |= USED_MOD_SUIT
var/obj/item/clothing/suit/space/eva/plasmaman/P = target
P.name = "plasma containment suit"
P.desc = "A feminine containment suit designed to keep plasma in, and everything else out. It's even got an overskirt."
P.icon_state = "plasmaman_halo"
if(P == H.wear_suit)
H.update_inv_wear_suit()
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/fluff/lighty_plasman_modkit // LightFire53: Ikelos
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
w_class = 2
force = 0
throwforce = 0
var/picked_color = null
var/list/helmets = list(
"Blue" = "plasmaman_ikelosdefault_helmet",
"Gold" = "plasmaman_ikelosgold_helmet",
"Red" = "plasmaman_ikelossecurity_helmet")
var/list/suits = list(
"Blue" = "plasmaman_ikelosdefault",
"Gold" = "plasmaman_ikelosgold",
"Red" = "plasmaman_ikelossecurity")
/obj/item/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
if(used & USED_MOD_HELM)
to_chat(H, "<span class='notice'>The kit's helmet modifier has already been used.</span>")
return
picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in helmets
var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
if(!picked_color)
return
P.icon_state = helmets[picked_color] + "[P.on]"
P.base_state = helmets[picked_color]
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
P.icon = 'icons/obj/custom_items.dmi'
used |= USED_MOD_HELM
if(P == H.head)
H.update_inv_head()
return
if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
if(used & USED_MOD_SUIT)
to_chat(user, "<span class='notice'>The kit's suit modifier has already been used.</span>")
return
picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in suits
var/obj/item/clothing/suit/space/eva/plasmaman/P = target
if(!picked_color)
return
P.icon_state = suits[picked_color]
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
P.icon = 'icons/obj/custom_items.dmi'
used |= USED_MOD_SUIT
if(P == H.wear_suit)
H.update_inv_wear_suit()
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
name = "SG Helmet modkit"
desc = "A modkit that can make most helmets look like a Shellguard Helmet."
+1
View File
@@ -26,6 +26,7 @@
if(C)
GLOB.respawnable_list -= C.client
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
new_xeno.amount_grown += (0.75 * new_xeno.max_grown) //event spawned larva start off almost ready to evolve.
new_xeno.key = C.key
if(SSticker && SSticker.mode)
SSticker.mode.xenos += new_xeno.mind
+2 -2
View File
@@ -1,6 +1,6 @@
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
announceWhen = 5
/datum/event/grid_check/setup()
endWhen = rand(30,120)
@@ -12,7 +12,7 @@
if(!M.client || !is_station_level(T.z))
continue
SEND_SOUND(M, S)
/datum/event/grid_check/announce()
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
+146
View File
@@ -0,0 +1,146 @@
#define LOC_ATMOS_CONTROL 0
#define LOC_FPMAINT 1
#define LOC_FPMAINT2 2
#define LOC_FSMAINT 3
#define LOC_FSMAINT2 4
#define LOC_ASMAINT 5
#define LOC_ASMAINT2 6
#define LOC_APMAINT 7
#define LOC_MAINTCENTRAL 8
#define LOC_FORE 9
#define LOC_STARBOARD 10
#define LOC_PORT 11
#define LOC_AFT 12
#define LOC_STORAGE 13
#define LOC_DISPOSAL 14
#define LOC_GENETICS 15
#define LOC_ELECTRICAL 16
#define LOC_ABANDONEDBAR 17
#define LOC_ELECTRICAL_SHOP 18
#define LOC_GAMBLING_DEN 19
#define HEADCRAB_NORMAL 0
/*#define HEADCRAB_SPECIAL 1
#define HEADCRAB_CLOWN 2 */ //Planned for the future
/datum/event/headcrabs
announceWhen = 10
endWhen = 11
var/location
var/locstring
var/headcrab
/datum/event/headcrabs/start()
location = rand(0,19)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
if(LOC_ATMOS_CONTROL)
spawn_area_type = /area/maintenance/atmos_control
locstring = "Atmospherics Maintenance"
if(LOC_FPMAINT)
spawn_area_type = /area/maintenance/fpmaint
locstring = "EVA Maintenance"
if(LOC_FPMAINT2)
spawn_area_type = /area/maintenance/fpmaint2
locstring = "Arrivals North Maintenance"
if(LOC_FSMAINT)
spawn_area_type = /area/maintenance/fsmaint
locstring = "Dormitory Maintenance"
if(LOC_FSMAINT2)
spawn_area_type = /area/maintenance/fsmaint2
locstring = "Bar Maintenance"
if(LOC_ASMAINT)
spawn_area_type = /area/maintenance/asmaint
locstring = "Medbay Maintenance"
if(LOC_ASMAINT2)
spawn_area_type = /area/maintenance/asmaint2
locstring = "Science Maintenance"
if(LOC_APMAINT)
spawn_area_type = /area/maintenance/apmaint
locstring = "Cargo Maintenance"
if(LOC_MAINTCENTRAL)
spawn_area_type = /area/maintenance/maintcentral
locstring = "Bridge Maintenance"
if(LOC_FORE)
spawn_area_type = /area/maintenance/fore
locstring = "Fore Maintenance"
if(LOC_STARBOARD)
spawn_area_type = /area/maintenance/starboard
locstring = "Starboard Maintenance"
if(LOC_PORT)
spawn_area_type = /area/maintenance/port
locstring = "Locker Room Maintenance"
if(LOC_AFT)
spawn_area_type = /area/maintenance/aft
locstring = "Engineering Maintenance"
if(LOC_STORAGE)
spawn_area_type = /area/maintenance/storage
locstring = "Atmospherics Maintenance"
if(LOC_DISPOSAL)
spawn_area_type = /area/maintenance/disposal
locstring = "Waste Disposal"
if(LOC_GENETICS)
spawn_area_type = /area/maintenance/genetics
locstring = "Genetics Maintenance"
if(LOC_ELECTRICAL)
spawn_area_type = /area/maintenance/electrical
locstring = "Electrical Maintenance"
if(LOC_ABANDONEDBAR)
spawn_area_type = /area/maintenance/abandonedbar
locstring = "Maintenance Bar"
if(LOC_ELECTRICAL_SHOP)
spawn_area_type = /area/maintenance/electrical_shop
locstring ="Electronics Den"
if(LOC_GAMBLING_DEN)
spawn_area_type = /area/maintenance/gambling_den
locstring = "Gambling Den"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
if(turf_clear(F))
turfs += F
var/list/spawn_types = list()
var/max_number
headcrab = 0 //rand(0,x) for the future
switch(headcrab) //Switch is for the future
if(HEADCRAB_NORMAL)
spawn_types = list(/mob/living/simple_animal/hostile/headcrab)
max_number = 6
var/num = rand(2,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
var/spawn_type = pick(spawn_types)
new spawn_type(T)
/datum/event/headcrabs/announce()
event_announcement.Announce("Bioscans indicate that creatures have been breeding in [locstring]. Clear them out, before this starts to affect productivity", "Lifesign Alert")
#undef LOC_ATMOS_CONTROL
#undef LOC_FPMAINT
#undef LOC_FPMAINT2
#undef LOC_FSMAINT
#undef LOC_FSMAINT2
#undef LOC_ASMAINT
#undef LOC_ASMAINT2
#undef LOC_APMAINT
#undef LOC_MAINTCENTRAL
#undef LOC_FORE
#undef LOC_STARBOARD
#undef LOC_PORT
#undef LOC_AFT
#undef LOC_STORAGE
#undef LOC_DISPOSAL
#undef LOC_GENETICS
#undef LOC_ELECTRICAL
#undef LOC_ABANDONEDBAR
#undef LOC_ELECTRICAL_SHOP
#undef LOC_GAMBLING_DEN
#undef HEADCRAB_NORMAL
@@ -258,7 +258,7 @@
/obj/item/reagent_containers/food/snacks/candy/gummybear/wtf
name = "gummy bear"
desc = "A small bear. Wait... what?"
icon_state = "gbear_wtf"
icon_state = "gbear_rainbow"
filling_color = "#60A584"
list_reagents = list("sugar" = 10, "space_drugs" = 2)
@@ -318,7 +318,7 @@
/obj/item/reagent_containers/food/snacks/candy/gummyworm/wtf
name = "gummy worm"
desc = "An edible worm. Did it just move?"
icon_state = "gworm_wtf"
icon_state = "gworm_rainbow"
filling_color = "#60A584"
list_reagents = list("sugar" = 10, "space_drugs" = 2)
@@ -413,7 +413,7 @@
/obj/item/reagent_containers/food/snacks/candy/jellybean/wtf
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. You aren't sure what color it is."
icon_state = "jbean_wtf"
icon_state = "jbean_rainbow"
filling_color = "#60A584"
list_reagents = list("sugar" = 10, "space_drugs" = 2)
@@ -152,7 +152,7 @@
/obj/item/reagent_containers/food/snacks/bacon
name = "bacon"
desc = "It looks crispy and tastes amazing! Mmm... Bacon."
icon_state = "bacon2"
icon_state = "bacon"
list_reagents = list("nutriment" = 4, "porktonium" = 10, "msg" = 4)
/obj/item/reagent_containers/food/snacks/telebacon
@@ -168,8 +168,9 @@
/obj/item/reagent_containers/food/snacks/telebacon/On_Consume(mob/M, mob/user)
if(!reagents.total_volume)
baconbeacon.loc = user
baconbeacon.forceMove(user)
baconbeacon.digest_delay()
baconbeacon = null
/obj/item/reagent_containers/food/snacks/meatball
name = "meatball"
@@ -11,6 +11,7 @@
broken_icon = "mwb"
dirty_icon = "mwbloody"
open_icon = "mw-o"
pass_flags = PASSTABLE
// see code/modules/food/recipes_microwave.dm for recipes
+1
View File
@@ -2,6 +2,7 @@
name = "plant DNA manipulator"
desc = "An advanced device designed to manipulate plant genetic makeup."
icon = 'icons/obj/hydroponics/equipment.dmi'
pass_flags = PASSTABLE
icon_state = "dnamod"
density = 1
anchored = 1
@@ -72,6 +72,16 @@
attack_verb = list("slashed", "sliced", "cut", "clawed")
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/cultivator/rake
name = "rake"
icon_state = "rake"
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("slashed", "sliced", "bashed", "clawed")
hitsound = null
materials = null
flags = NONE
burn_state = FLAMMABLE
/obj/item/hatchet
name = "hatchet"
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
+1 -1
View File
@@ -222,7 +222,7 @@ var/list/karma_spenders = list()
<a href='?src=[UID()];karmashop=shop;KarmaBuy2=7'>Unlock Drask -- 30KP</a><br>
<a href='?src=[UID()];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>
<a href='?src=[UID()];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>
<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 100KP</a><br>
<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 45KP</a><br>
"}
if(2) // Karma Refunds
+6
View File
@@ -0,0 +1,6 @@
/mob/living/silicon/ai/key_down(_key, client/user)
switch(_key)
if("4")
a_intent_change(INTENT_HOTKEY_LEFT)
return
return ..()
+4 -2
View File
@@ -40,9 +40,11 @@
if(21 to 25)
for(var/i in 1 to 5)
new /obj/item/poster/random_contraband(src)
if(26 to 35)
if(26 to 30)
for(var/i in 1 to 3)
new /obj/item/reagent_containers/glass/beaker/noreact(src)
if(31 to 35)
new /obj/item/seeds/firelemon(src)
if(36 to 40)
new /obj/item/melee/baton(src)
if(41 to 45)
@@ -109,7 +111,7 @@
if(90)
new /obj/item/organ/internal/heart(src)
if(91)
new /obj/item/soulstone(src)
new /obj/item/soulstone/anybody(src)
if(92)
new /obj/item/katana(src)
if(93)
-153
View File
@@ -1,153 +0,0 @@
/*****************************Coin********************************/
/obj/item/coin
icon = 'icons/obj/economy.dmi'
name = "coin"
icon_state = "coin__heads"
flags = CONDUCT
force = 1
throwforce = 2
w_class = WEIGHT_CLASS_TINY
var/string_attached
var/list/sideslist = list("heads","tails")
var/cmineral = null
var/cooldown = 0
var/credits = 10
/obj/item/coin/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
icon_state = "coin_[cmineral]_[sideslist[1]]"
if(cmineral)
name = "[cmineral] coin"
/obj/item/coin/gold
cmineral = "gold"
icon_state = "coin_gold_heads"
materials = list(MAT_GOLD = 400)
credits = 160
/obj/item/coin/silver
cmineral = "silver"
icon_state = "coin_silver_heads"
materials = list(MAT_SILVER = 400)
credits = 40
/obj/item/coin/diamond
cmineral = "diamond"
icon_state = "coin_diamond_heads"
materials = list(MAT_DIAMOND = 400)
credits = 120
/obj/item/coin/iron
cmineral = "iron"
icon_state = "coin_iron_heads"
materials = list(MAT_METAL = 400)
credits = 20
/obj/item/coin/plasma
cmineral = "plasma"
icon_state = "coin_plasma_heads"
materials = list(MAT_PLASMA = 400)
credits = 80
/obj/item/coin/uranium
cmineral = "uranium"
icon_state = "coin_uranium_heads"
materials = list(MAT_URANIUM = 400)
credits = 160
/obj/item/coin/clown
cmineral = "bananium"
icon_state = "coin_bananium_heads"
materials = list(MAT_BANANIUM = 400)
credits = 600 //makes the clown cri
/obj/item/coin/mime
cmineral = "tranquillite"
icon_state = "coin_tranquillite_heads"
materials = list(MAT_TRANQUILLITE = 400)
credits = 600 //makes the mime cri
/obj/item/coin/adamantine
cmineral = "adamantine"
icon_state = "coin_adamantine_heads"
credits = 400
/obj/item/coin/mythril
cmineral = "mythril"
icon_state = "coin_mythril_heads"
credits = 400
/obj/item/coin/twoheaded
cmineral = "iron"
icon_state = "coin_iron_heads"
desc = "Hey, this coin's the same on both sides!"
sideslist = list("heads")
credits = 20
/obj/item/coin/antagtoken
name = "antag token"
icon_state = "coin_valid_valid"
cmineral = "valid"
desc = "A novelty coin that helps the heart know what hard evidence cannot prove."
sideslist = list("valid", "salad")
credits = 20
/obj/item/coin/antagtoken/syndicate
name = "syndicate coin"
credits = 160
/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
if(string_attached)
to_chat(user, "<span class='notice'>There already is a string attached to this coin.</span>")
return
if(CC.use(1))
overlays += image('icons/obj/economy.dmi',"coin_string_overlay")
string_attached = 1
to_chat(user, "<span class='notice'>You attach a string to the coin.</span>")
else
to_chat(user, "<span class='warning'>You need one length of cable to attach a string to the coin.</span>")
return
else if(istype(W,/obj/item/wirecutters))
if(!string_attached)
..()
return
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
CC.amount = 1
CC.update_icon()
overlays = list()
string_attached = null
to_chat(user, "<span class='notice'>You detach the string from the coin.</span>")
else if(istype(W,/obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
if(WT.welding && WT.remove_fuel(0, user))
var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
"silver" = /obj/item/clothing/gloves/ring/silver,
"gold" = /obj/item/clothing/gloves/ring/gold,
"plasma" = /obj/item/clothing/gloves/ring/plasma,
"uranium" = /obj/item/clothing/gloves/ring/uranium)
var/typekey = typelist[cmineral]
if(ispath(typekey))
to_chat(user, "<span class='notice'>You make [src] into a ring.</span>")
new typekey(get_turf(loc))
qdel(src)
else ..()
/obj/item/coin/attack_self(mob/user as mob)
if(cooldown < world.time - 15)
var/coinflip = pick(sideslist)
cooldown = world.time
flick("coin_[cmineral]_flip", src)
icon_state = "coin_[cmineral]_[coinflip]"
playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
if(do_after(user, 15, target = src))
user.visible_message("<span class='notice'>[user] has flipped [src]. It lands on [coinflip].</span>", \
"<span class='notice'>You flip [src]. It lands on [coinflip].</span>", \
"<span class='notice'>You hear the clattering of loose change.</span>")
@@ -0,0 +1,97 @@
/****************Explorer's Suit and Mask****************/
/obj/item/clothing/suit/hooded/explorer
name = "explorer suit"
desc = "An armoured suit for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/explorer
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi'
)
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = HEAD
flags = BLOCKHAIR | NODROP
flags_cover = HEADCOVERSEYES
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Drask" = 'icons/mob/species/drask/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi',
"Skrell" = 'icons/mob/species/skrell/head.dmi'
)
/obj/item/clothing/suit/space/hostile_environment
name = "H.E.C.K. suit"
desc = "Hostile Environment Cross-Kinetic Suit: A suit designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
icon_state = "hostile_env"
item_state = "hostile_env"
flags = THICKMATERIAL //not spaceproof
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
burn_state = FIRE_PROOF | LAVA_PROOF
slowdown = 0
armor = list(melee = 70, bullet = 40, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 100)
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
/obj/item/clothing/suit/space/hostile_environment/New()
..()
AddComponent(/datum/component/spraycan_paintable)
START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/space/hostile_environment/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/space/hostile_environment/process()
var/mob/living/carbon/C = loc
if(istype(C) && prob(2)) //cursed by bubblegum
if(prob(15))
new /obj/effect/hallucination/oh_yeah(get_turf(C), C)
to_chat(C, "<span class='colossus'><b>[pick("I AM IMMORTAL.","I SHALL TAKE BACK WHAT'S MINE.","I SEE YOU.","YOU CANNOT ESCAPE ME FOREVER.","DEATH CANNOT HOLD ME.")]</b></span>")
else
to_chat(C, "<span class='warning'>[pick("You hear faint whispers.","You smell ash.","You feel hot.","You hear a roar in the distance.")]</span>")
/obj/item/clothing/head/helmet/space/hostile_environment
name = "H.E.C.K. helmet"
desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
icon_state = "hostile_env"
item_state = "hostile_env"
w_class = WEIGHT_CLASS_NORMAL
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
flags = THICKMATERIAL // no space protection
armor = list(melee = 70, bullet = 40, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 100)
burn_state = FIRE_PROOF | LAVA_PROOF
/obj/item/clothing/head/helmet/space/hostile_environment/New()
..()
AddComponent(/datum/component/spraycan_paintable)
update_icon()
/obj/item/clothing/head/helmet/space/hostile_environment/update_icon()
..()
cut_overlays()
var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hostile_env_glass")
glass_overlay.appearance_flags = RESET_COLOR
add_overlay(glass_overlay)
@@ -0,0 +1,439 @@
/*********************Mining Hammer****************/
/obj/item/twohanded/kinetic_crusher
icon = 'icons/obj/mining.dmi'
icon_state = "crusher"
item_state = "crusher0"
name = "proto-kinetic crusher"
desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, forming a high-tech club. \
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna."
force = 0 //You can't hit stuff unless wielded
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 0
force_wielded = 20
throwforce = 5
throw_speed = 4
armour_penetration = 10
materials = list(MAT_METAL = 1150, MAT_GLASS = 2075)
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
sharp = TRUE
actions_types = list(/datum/action/item_action/toggle_light)
var/list/trophies = list()
var/charged = TRUE
var/charge_time = 15
var/detonation_damage = 50
var/backstab_bonus = 30
var/light_on = FALSE
var/brightness_on = 5
/obj/item/twohanded/kinetic_crusher/Destroy()
QDEL_LIST(trophies)
return ..()
/obj/item/twohanded/kinetic_crusher/examine(mob/living/user)
..()
to_chat(user, "<span class='notice'>Mark a large creature with the destabilizing force, then hit them in melee to do <b>[force + detonation_damage]</b> damage.</span>")
to_chat(user, "<span class='notice'>Does <b>[force + detonation_damage + backstab_bonus]</b> damage if the target is backstabbed, instead of <b>[force + detonation_damage]</b>.</span>")
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
to_chat(user, "<span class='notice'>It has \a [T] attached, which causes [T.effect_desc()].</span>")
/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user)
if(iscrowbar(I))
if(LAZYLEN(trophies))
to_chat(user, "<span class='notice'>You remove [src]'s trophies.</span>")
playsound(loc, I.usesound, 100, 1)
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
T.remove_from(src, user)
else
to_chat(user, "<span class='warning'>There are no trophies on [src].</span>")
else if(istype(I, /obj/item/crusher_trophy))
var/obj/item/crusher_trophy/T = I
T.add_to(src, user)
else
return ..()
/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
if(!wielded)
to_chat(user, "<span class='warning'>[src] is too heavy to use with one hand. You fumble and drop everything.")
user.drop_r_hand()
user.drop_l_hand()
return
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = target.health
..()
for(var/t in trophies)
if(!QDELETED(target))
var/obj/item/crusher_trophy/T = t
T.on_melee_hit(target, user)
if(!QDELETED(C) && !QDELETED(target))
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
/obj/item/twohanded/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
. = ..()
if(!wielded)
return
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = user.loc
if(!isturf(proj_turf))
return
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
T.on_projectile_fire(D, user)
D.preparePixelProjectile(target, get_turf(target), user, clickparams)
D.firer = user
D.hammer_synced = src
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
D.fire()
charged = FALSE
update_icon()
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
return
if(proximity_flag && isliving(target))
var/mob/living/L = target
var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
return
var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = L.health
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
T.on_mark_detonation(target, user)
if(!QDELETED(L))
if(!QDELETED(C))
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
var/backstab_dir = get_dir(user, L)
var/def_check = L.getarmor(type = "bomb")
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
if(!QDELETED(C))
C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item
L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check)
playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
else
if(!QDELETED(C))
C.total_damage += detonation_damage
L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
/obj/item/twohanded/kinetic_crusher/proc/Recharge()
if(!charged)
charged = TRUE
update_icon()
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
/obj/item/twohanded/kinetic_crusher/ui_action_click(mob/user, actiontype)
light_on = !light_on
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_brightness(user)
update_icon()
/obj/item/twohanded/kinetic_crusher/proc/update_brightness(mob/user = null)
if(light_on)
set_light(brightness_on)
else
set_light(0)
/obj/item/twohanded/kinetic_crusher/update_icon()
..()
cut_overlays()
if(!charged)
add_overlay("[icon_state]_uncharged")
if(light_on)
add_overlay("[icon_state]_lit")
spawn(1)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
item_state = "crusher[wielded]"
//destablizing force
/obj/item/projectile/destabilizer
name = "destabilizing force"
icon_state = "pulse1"
nodamage = TRUE
damage = 0 //We're just here to mark people. This is still a melee weapon.
damage_type = BRUTE
flag = "bomb"
range = 6
log_override = TRUE
var/obj/item/twohanded/kinetic_crusher/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
hammer_synced = null
return ..()
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
if(isliving(target))
var/mob/living/L = target
var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean
var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced)
if(hammer_synced)
for(var/t in hammer_synced.trophies)
var/obj/item/crusher_trophy/T = t
T.on_mark_application(target, CM, had_effect)
var/target_turf = get_turf(target)
if(ismineralturf(target_turf))
var/turf/simulated/mineral/M = target_turf
new /obj/effect/temp_visual/kinetic_blast(M)
M.gets_drilled(firer)
..()
//trophies
/obj/item/crusher_trophy
name = "tail spike"
desc = "A strange spike with no usage."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "tail_spike"
var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is
var/denied_type = /obj/item/crusher_trophy
/obj/item/crusher_trophy/examine(mob/living/user)
..()
to_chat(user, "<span class='notice'>Causes [effect_desc()] when attached to a kinetic crusher.</span>")
/obj/item/crusher_trophy/proc/effect_desc()
return "errors"
/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
if(istype(A, /obj/item/twohanded/kinetic_crusher))
add_to(A, user)
else
..()
/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
for(var/t in H.trophies)
var/obj/item/crusher_trophy/T = t
if(istype(T, denied_type) || istype(src, T.denied_type))
to_chat(user, "<span class='warning'>You can't seem to attach [src] to [H]. Maybe remove a few trophies?</span>")
return FALSE
if(!user.drop_item())
return
forceMove(H)
H.trophies += src
to_chat(user, "<span class='notice'>You attach [src] to [H].</span>")
return TRUE
/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
forceMove(get_turf(H))
H.trophies -= src
return TRUE
/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user
/obj/item/crusher_trophy/proc/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user
//goliath
/obj/item/crusher_trophy/goliath_tentacle
name = "goliath tentacle"
desc = "A sliced-off goliath tentacle. Suitable as a trophy for a kinetic crusher."
icon_state = "goliath_tentacle"
denied_type = /obj/item/crusher_trophy/goliath_tentacle
bonus_value = 2
var/missing_health_ratio = 0.1
var/missing_health_desc = 10
/obj/item/crusher_trophy/goliath_tentacle/effect_desc()
return "mark detonation to do <b>[bonus_value]</b> more damage for every <b>[missing_health_desc]</b> health you are missing"
/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
var/missing_health = user.health - user.maxHealth
missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
missing_health *= bonus_value //multiply the remaining amount by bonus_value
if(missing_health > 0)
target.adjustBruteLoss(missing_health) //and do that much damage
//watcher
/obj/item/crusher_trophy/watcher_wing
name = "watcher wing"
desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "watcher_wing"
denied_type = /obj/item/crusher_trophy/watcher_wing
bonus_value = 5
/obj/item/crusher_trophy/watcher_wing/effect_desc()
return "mark detonation to prevent certain creatures from using certain attacks for <b>[bonus_value*0.1]</b> second\s"
/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user)
if(ishostile(target))
var/mob/living/simple_animal/hostile/H = target
if(H.ranged) //briefly delay ranged attacks
if(H.ranged_cooldown >= world.time)
H.ranged_cooldown += bonus_value
else
H.ranged_cooldown = bonus_value + world.time
//magmawing watcher
/obj/item/crusher_trophy/blaster_tubes/magma_wing
name = "magmawing watcher wing"
desc = "A still-searing wing from a magmawing watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "magma_wing"
gender = NEUTER
bonus_value = 5
/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc()
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage"
/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
if(deadly_shot)
marker.name = "heated [marker.name]"
marker.icon_state = "lava"
marker.damage = bonus_value
marker.nodamage = FALSE
deadly_shot = FALSE
//icewing watcher
/obj/item/crusher_trophy/watcher_wing/ice_wing
name = "icewing watcher wing"
desc = "A carefully preserved frozen wing from an icewing watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "ice_wing"
bonus_value = 8
//legion
/obj/item/crusher_trophy/legion_skull
name = "legion skull"
desc = "A dead and lifeless legion skull. Suitable as a trophy for a kinetic crusher."
icon_state = "legion_skull"
denied_type = /obj/item/crusher_trophy/legion_skull
bonus_value = 3
/obj/item/crusher_trophy/legion_skull/effect_desc()
return "a kinetic crusher to recharge <b>[bonus_value*0.1]</b> second\s faster"
/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time -= bonus_value
/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time += bonus_value
//blood-drunk hunter
/obj/item/crusher_trophy/miner_eye
name = "eye of a blood-drunk hunter"
desc = "Its pupil is collapsed and turned to mush. Suitable as a trophy for a kinetic crusher."
icon_state = "hunter_eye"
denied_type = /obj/item/crusher_trophy/miner_eye
/obj/item/crusher_trophy/miner_eye/effect_desc()
return "mark detonation to grant stun immunity and <b>90%</b> damage reduction for <b>1</b> second"
/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user)
user.apply_status_effect(STATUS_EFFECT_BLOODDRUNK)
//ash drake
/obj/item/crusher_trophy/tail_spike
desc = "A spike taken from an ash drake's tail. Suitable as a trophy for a kinetic crusher."
denied_type = /obj/item/crusher_trophy/tail_spike
bonus_value = 5
/obj/item/crusher_trophy/tail_spike/effect_desc()
return "mark detonation to do <b>[bonus_value]</b> damage to nearby creatures and push them back"
/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user)
for(var/mob/living/L in oview(2, user))
if(L.stat == DEAD)
continue
playsound(L, 'sound/magic/fireball.ogg', 20, 1)
new /obj/effect/temp_visual/fire(L.loc)
addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
L.adjustFireLoss(bonus_value)
/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
step(target, get_dir(user, target))
//bubblegum
/obj/item/crusher_trophy/demon_claws
name = "demon claws"
desc = "A set of blood-drenched claws from a massive demon's hand. Suitable as a trophy for a kinetic crusher."
icon_state = "demon_claws"
gender = PLURAL
denied_type = /obj/item/crusher_trophy/demon_claws
bonus_value = 10
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
/obj/item/crusher_trophy/demon_claws/effect_desc()
return "melee hits to do <b>[bonus_value * 0.2]</b> more damage and heal you for <b>[bonus_value * 0.1]</b>, with <b>5X</b> effect on mark detonation"
/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force += bonus_value * 0.2
H.force_unwielded += bonus_value * 0.2
H.force_wielded += bonus_value * 0.2
H.detonation_damage += bonus_value * 0.8
/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force -= bonus_value * 0.2
H.force_unwielded -= bonus_value * 0.2
H.force_wielded -= bonus_value * 0.2
H.detonation_damage -= bonus_value * 0.8
/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user)
user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
//colossus
/obj/item/crusher_trophy/blaster_tubes
name = "blaster tubes"
desc = "The blaster tubes from a colossus's arm. Suitable as a trophy for a kinetic crusher."
icon_state = "blaster_tubes"
gender = PLURAL
denied_type = /obj/item/crusher_trophy/blaster_tubes
bonus_value = 15
var/deadly_shot = FALSE
/obj/item/crusher_trophy/blaster_tubes/effect_desc()
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage but move slower"
/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
if(deadly_shot)
marker.name = "deadly [marker.name]"
marker.icon_state = "chronobolt"
marker.damage = bonus_value
marker.nodamage = FALSE
marker.speed = 2
deadly_shot = FALSE
/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user)
deadly_shot = TRUE
addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot()
deadly_shot = FALSE
//hierophant
/obj/item/crusher_trophy/vortex_talisman
name = "vortex talisman"
desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher."
icon_state = "vortex_talisman"
denied_type = /obj/item/crusher_trophy/vortex_talisman
/obj/item/crusher_trophy/vortex_talisman/effect_desc()
return "mark detonation to create a barrier you can pass"
/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user)
var/turf/T = get_turf(user)
new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass!
var/turf/otherT = get_step(T, turn(user.dir, 90))
if(otherT)
new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
otherT = get_step(T, turn(user.dir, -90))
if(otherT)
new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
/obj/effect/temp_visual/hierophant/wall/crusher
duration = 75
@@ -0,0 +1,122 @@
/**********************Lazarus Injector**********************/
/obj/item/lazarus_injector
name = "lazarus injector"
desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
icon = 'icons/obj/hypo.dmi'
icon_state = "lazarus_hypo"
item_state = "hypo"
origin_tech = "biotech=4;magnets=6"
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
var/loaded = 1
var/malfunctioning = 0
var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
/obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
if(!loaded)
return
if(istype(target, /mob/living) && proximity_flag)
if(istype(target, /mob/living/simple_animal))
var/mob/living/simple_animal/M = target
if(M.sentience_type != revive_type)
to_chat(user, "<span class='info'>[src] does not work on this sort of creature.</span>")
return
if(M.stat == DEAD)
M.faction = list("neutral")
M.revive()
M.can_collar = 1
if(istype(target, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
if(malfunctioning)
H.faction |= list("lazarus", "\ref[user]")
H.robust_searching = 1
H.friends += user
H.attack_same = 1
log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
else
H.attack_same = 0
loaded = 0
user.visible_message("<span class='notice'>[user] injects [M] with [src], reviving it.</span>")
playsound(src,'sound/effects/refill.ogg',50,1)
icon_state = "lazarus_empty"
return
else
to_chat(user, "<span class='info'>[src] is only effective on the dead.</span>")
return
else
to_chat(user, "<span class='info'>[src] is only effective on lesser beings.</span>")
return
/obj/item/lazarus_injector/emag_act(mob/user)
if(!malfunctioning)
malfunctioning = 1
to_chat(user, "<span class='notice'>You override [src]'s safety protocols.</span>")
/obj/item/lazarus_injector/emp_act()
if(!malfunctioning)
malfunctioning = 1
/obj/item/lazarus_injector/examine(mob/user)
..(user)
if(!loaded)
to_chat(user, "<span class='info'>[src] is empty.</span>")
if(malfunctioning)
to_chat(user, "<span class='info'>The display on [src] seems to be flickering.</span>")
/*********************Mob Capsule*************************/
/obj/item/mobcapsule
name = "lazarus capsule"
desc = "It allows you to store and deploy lazarus-injected creatures easier."
icon = 'icons/obj/mobcap.dmi'
icon_state = "mobcap0"
w_class = WEIGHT_CLASS_TINY
throw_range = 20
var/mob/living/simple_animal/captured = null
var/colorindex = 0
/obj/item/mobcapsule/Destroy()
if(captured)
captured.ghostize()
QDEL_NULL(captured)
return ..()
/obj/item/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
if(!istype(A, /mob/living/simple_animal) || isbot(A))
return ..()
capture(A, user)
return 1
/obj/item/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob)
var/mob/living/simple_animal/T = target
if(captured)
to_chat(U, "<span class='notice'>Capture failed!</span>: The capsule already has a mob registered to it!")
else
if(istype(T) && "neutral" in T.faction)
T.forceMove(src)
T.name = "[U.name]'s [initial(T.name)]"
T.cancel_camera()
name = "Lazarus Capsule: [initial(T.name)]"
to_chat(U, "<span class='notice'>You placed a [T.name] inside the Lazarus Capsule!</span>")
captured = T
else
to_chat(U, "You can't capture that mob!")
/obj/item/mobcapsule/throw_impact(atom/A, mob/user)
..()
if(captured)
dump_contents(user)
/obj/item/mobcapsule/proc/dump_contents(mob/user)
if(captured)
captured.forceMove(get_turf(src))
captured = null
/obj/item/mobcapsule/attack_self(mob/user)
colorindex += 1
if(colorindex >= 6)
colorindex = 0
icon_state = "mobcap[colorindex]"
update_icon()
@@ -0,0 +1,116 @@
/**********************Mining Scanner**********************/
/obj/item/mining_scanner
desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
name = "manual mining scanner"
icon = 'icons/obj/device.dmi'
icon_state = "mining1"
item_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
origin_tech = "engineering=1;magnets=1"
/obj/item/mining_scanner/attack_self(mob/user)
if(!user.client)
return
if(!cooldown)
cooldown = 1
spawn(40)
cooldown = 0
var/list/mobs = list()
mobs |= user
mineral_scan_pulse(mobs, get_turf(user))
//Debug item to identify all ore spread quickly
/obj/item/mining_scanner/admin
/obj/item/mining_scanner/admin/attack_self(mob/user)
for(var/turf/simulated/mineral/M in world)
if(M.scan_state)
M.icon_state = M.scan_state
qdel(src)
/obj/item/t_scanner/adv_mining_scanner
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 35
var/on_cooldown = 0
var/range = 7
var/meson = TRUE
origin_tech = "engineering=3;magnets=3"
/obj/item/t_scanner/adv_mining_scanner/cyborg
flags = CONDUCT | NODROP
/obj/item/t_scanner/adv_mining_scanner/material
meson = FALSE
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
/obj/item/t_scanner/adv_mining_scanner/lesser
name = "automatic mining scanner"
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
range = 4
cooldown = 50
/obj/item/t_scanner/adv_mining_scanner/lesser/material
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
meson = FALSE
/obj/item/t_scanner/adv_mining_scanner/scan()
if(!on_cooldown)
on_cooldown = 1
spawn(cooldown)
on_cooldown = 0
var/turf/t = get_turf(src)
var/list/mobs = recursive_mob_check(t, client_check = 1, sight_check = 0, include_radio = 0)
if(!mobs.len)
return
if(meson)
mineral_scan_pulse(mobs, t, range)
else
mineral_scan_pulse_material(mobs, t, range)
//For use with mesons
/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/simulated/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
if(minerals.len)
for(var/mob/user in mobs)
if(user.client)
var/client/C = user.client
for(var/turf/simulated/mineral/M in minerals)
var/turf/F = get_turf(M)
var/image/I = image('icons/turf/mining.dmi', loc = F, icon_state = M.scan_state, layer = 18)
C.images += I
spawn(30)
if(C)
C.images -= I
//For use with material scanners
/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/simulated/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
if(minerals.len)
for(var/turf/simulated/mineral/M in minerals)
var/obj/effect/temp_visual/mining_overlay/C = new/obj/effect/temp_visual/mining_overlay(M)
C.icon_state = M.scan_state
/obj/effect/temp_visual/mining_overlay
layer = 18
icon = 'icons/turf/mining.dmi'
anchored = 1
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
duration = 30
pixel_x = -4
pixel_y = -4
@@ -0,0 +1,142 @@
/*****************Pickaxes & Drills & Shovels****************/
/obj/item/pickaxe
name = "pickaxe"
icon = 'icons/obj/items.dmi'
icon_state = "pickaxe"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 15
throwforce = 10
item_state = "pickaxe"
w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
origin_tech = "materials=2;engineering=3"
attack_verb = list("hit", "pierced", "sliced", "attacked")
var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
var/drill_verb = "picking"
sharp = 1
var/excavation_amount = 100
usesound = 'sound/effects/picaxe1.ogg'
toolspeed = 1
/obj/item/pickaxe/proc/playDigSound()
playsound(src, pick(digsound),20,1)
/obj/item/pickaxe/emergency
name = "emergency disembarkation tool"
desc = "For extracting yourself from rough landings."
/obj/item/pickaxe/safety
name = "safety pickaxe"
desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."
force = 1
throwforce = 1
attack_verb = list("ineffectively hit")
/obj/item/pickaxe/mini
name = "compact pickaxe"
desc = "A smaller, compact version of the standard pickaxe."
icon_state = "minipick"
force = 10
throwforce = 7
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL = 1000)
/obj/item/pickaxe/silver
name = "silver-plated pickaxe"
icon_state = "spickaxe"
item_state = "spickaxe"
origin_tech = "materials=3;engineering=4"
toolspeed = 0.5 //mines faster than a normal pickaxe, bought from mining vendor
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
force = 17
/obj/item/pickaxe/gold
name = "golden pickaxe"
icon_state = "gpickaxe"
item_state = "gpickaxe"
origin_tech = "materials=4;engineering=4"
toolspeed = 0.4
desc = "A gold-plated pickaxe that mines faster than standard-issue."
force = 18
/obj/item/pickaxe/diamond
name = "diamond-tipped pickaxe"
icon_state = "dpickaxe"
item_state = "dpickaxe"
origin_tech = "materials=5;engineering=4"
toolspeed = 0.3
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
force = 19
/obj/item/pickaxe/drill
name = "mining drill"
icon_state = "handdrill"
item_state = "jackhammer"
digsound = list('sound/weapons/drill.ogg')
toolspeed = 0.6 //available from roundstart, faster than a pickaxe.
hitsound = 'sound/weapons/drill.ogg'
usesound = 'sound/weapons/drill.ogg'
origin_tech = "materials=2;powerstorage=2;engineering=3"
desc = "An electric mining drill for the especially scrawny."
/obj/item/pickaxe/drill/cyborg
name = "cyborg mining drill"
desc = "An integrated electric mining drill."
flags = NODROP
/obj/item/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
icon_state = "diamonddrill"
origin_tech = "materials=6;powerstorage=4;engineering=4"
desc = "Yours is the drill that will pierce the heavens!"
toolspeed = 0.2
/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
icon_state = "diamonddrill"
toolspeed = 0.2
/obj/item/pickaxe/drill/jackhammer
name = "sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
usesound = 'sound/weapons/sonic_jackhammer.ogg'
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
toolspeed = 0.1 //the epitome of powertools. extremely fast mining, laughs at puny walls
/obj/item/shovel
name = "shovel"
desc = "A large tool for digging and moving dirt."
icon = 'icons/obj/items.dmi'
icon_state = "shovel"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 8
throwforce = 4
item_state = "shovel"
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=50)
origin_tech = "materials=2;engineering=2"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
usesound = 'sound/effects/shovel_dig.ogg'
toolspeed = 1
/obj/item/shovel/spade
name = "spade"
desc = "A small tool for digging and moving dirt."
icon_state = "spade"
item_state = "spade"
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
/obj/item/shovel/safety
name = "safety shovel"
desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."
force = 1
throwforce = 1
attack_verb = list("ineffectively hit")
@@ -0,0 +1,139 @@
/*********************Hivelord stabilizer****************/
/obj/item/hivelordstabilizer
name = "hivelord stabilizer"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely."
w_class = WEIGHT_CLASS_TINY
origin_tech = "biotech=3"
/obj/item/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user)
. = ..()
var/obj/item/organ/internal/hivelord_core/C = M
if(!istype(C, /obj/item/organ/internal/hivelord_core))
to_chat(user, "<span class='warning'>The stabilizer only works on certain types of monster organs, generally regenerative in nature.</span>")
return ..()
C.preserved()
to_chat(user, "<span class='notice'>You inject the [M] with the stabilizer. It will no longer go inert.</span>")
qdel(src)
/************************Hivelord core*******************/
/obj/item/organ/internal/hivelord_core
name = "hivelord remains"
desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness."
icon_state = "roro core 2"
flags = NOBLUDGEON
slot = "hivecore"
force = 0
actions_types = list(/datum/action/item_action/organ_action/use)
var/inert = 0
var/preserved = 0
/obj/item/organ/internal/hivelord_core/New()
..()
addtimer(CALLBACK(src, .proc/inert_check), 2400)
/obj/item/organ/internal/hivelord_core/proc/inert_check()
if(!preserved)
go_inert()
/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0)
inert = FALSE
preserved = TRUE
update_icon()
desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay."
if(implanted)
feedback_add_details("hivelord_core", "[type]|implanted")
else
feedback_add_details("hivelord_core", "[type]|stabilizer")
/obj/item/organ/internal/hivelord_core/proc/go_inert()
inert = TRUE
name = "decayed regenerative core"
desc = "All that remains of a hivelord. It has decayed, and is completely useless."
feedback_add_details("hivelord_core", "[src.type]|inert")
update_icon()
/obj/item/organ/internal/hivelord_core/ui_action_click()
if(inert)
to_chat(owner, "<span class='notice'>[src] breaks down as it tries to activate.</span>")
else
owner.revive()
qdel(src)
/obj/item/organ/internal/hivelord_core/on_life()
..()
if(owner.health < HEALTH_THRESHOLD_CRIT)
ui_action_click()
///Handles applying the core, logging and status/mood events.
/obj/item/organ/internal/hivelord_core/proc/applyto(atom/target, mob/user)
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(inert)
to_chat(user, "<span class='notice'>[src] has decayed and can no longer be used to heal.</span>")
return
else
if(H.stat == DEAD)
to_chat(user, "<span class='notice'>[src] is useless on the dead.</span>")
return
if(H != user)
H.visible_message("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()]!")
feedback_add_details("hivelord_core","[src.type]|used|other")
else
to_chat(user, "<span class='notice'>You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?</span>")
feedback_add_details("hivelord_core","[src.type]|used|self")
H.revive()
user.drop_item()
qdel(src)
/obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(proximity_flag)
applyto(target, user)
/obj/item/organ/internal/hivelord_core/attack_self(mob/user)
applyto(user, user)
/obj/item/organ/internal/hivelord_core/insert(mob/living/carbon/M, special = 0)
..()
if(!preserved && !inert)
preserved(TRUE)
owner.visible_message("<span class='notice'>[src] stabilizes as it's inserted.</span>")
/obj/item/organ/internal/hivelord_core/remove(mob/living/carbon/M, special = 0)
if(!inert && !special)
owner.visible_message("<span class='notice'>[src] rapidly decays as it's removed.</span>")
go_inert()
return ..()
/obj/item/organ/internal/hivelord_core/prepare_eat()
return null
/*************************Legion core********************/
/obj/item/organ/internal/hivelord_core/legion
name = "legion's soul"
desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
icon_state = "legion_soul"
/obj/item/organ/internal/hivelord_core/legion/New()
..()
update_icon()
/obj/item/organ/internal/hivelord_core/legion/update_icon()
icon_state = inert ? "legion_soul_inert" : "legion_soul"
cut_overlays()
if(!inert && !preserved)
add_overlay("legion_soul_crackle")
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/organ/internal/hivelord_core/legion/go_inert()
..()
desc = "[src] has become inert. It has decayed, and is completely useless."
/obj/item/organ/internal/hivelord_core/legion/preserved(implanted = 0)
..()
desc = "[src] has been stabilized. It is preserved, allowing you to use it to heal completely without danger of decay."
+116
View File
@@ -0,0 +1,116 @@
/**********************Resonator**********************/
/obj/item/resonator
name = "resonator"
icon = 'icons/obj/items.dmi'
icon_state = "resonator"
item_state = "resonator"
origin_tech = "magnets=3;engineering=3"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum."
w_class = WEIGHT_CLASS_NORMAL
force = 15
throwforce = 10
var/burst_time = 30
var/fieldlimit = 4
var/list/fields = list()
var/quick_burst_mod = 0.8
/obj/item/resonator/upgraded
name = "upgraded resonator"
desc = "An upgraded version of the resonator that can produce more fields at once."
icon_state = "resonator_u"
origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
fieldlimit = 6
quick_burst_mod = 1
/obj/item/resonator/attack_self(mob/user)
if(burst_time == 50)
burst_time = 30
to_chat(user, "<span class='info'>You set the resonator's fields to detonate after 3 seconds.</span>")
else
burst_time = 50
to_chat(user, "<span class='info'>You set the resonator's fields to detonate after 5 seconds.</span>")
/obj/item/resonator/proc/CreateResonance(target, mob/user)
var/turf/T = get_turf(target)
var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
if(R)
R.damage_multiplier = quick_burst_mod
R.burst()
return
if(LAZYLEN(fields) < fieldlimit)
new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
user.changeNext_move(CLICK_CD_MELEE)
/obj/item/resonator/pre_attackby(atom/target, mob/user, params)
if(check_allowed_items(target, 1))
CreateResonance(target, user)
return TRUE
//resonance field, crushes rock, damages mobs
/obj/effect/temp_visual/resonance
name = "resonance field"
desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
icon = 'icons/effects/effects.dmi'
icon_state = "shield1"
layer = ABOVE_ALL_MOB_LAYER
duration = 50
var/resonance_damage = 20
var/damage_multiplier = 1
var/creator
var/obj/item/resonator/res
/obj/effect/temp_visual/resonance/New(loc, set_creator, set_resonator, set_duration)
duration = set_duration
. = ..()
creator = set_creator
res = set_resonator
if(res)
res.fields += src
playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
transform = matrix() * 0.75
animate(src, transform = matrix() * 1.5, time = duration)
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
/obj/effect/temp_visual/resonance/Destroy()
if(res)
res.fields -= src
res = null
creator = null
return ..()
/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
if(!proj_turf)
proj_turf = get_turf(src)
resonance_damage = initial(resonance_damage)
if(lavaland_equipment_pressure_check(proj_turf))
name = "strong [initial(name)]"
resonance_damage *= 3
else
name = initial(name)
resonance_damage *= damage_multiplier
/obj/effect/temp_visual/resonance/proc/burst()
var/turf/T = get_turf(src)
new /obj/effect/temp_visual/resonance_crush(T)
if(ismineralturf(T))
var/turf/simulated/mineral/M = T
M.gets_drilled(creator)
check_pressure(T)
playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
for(var/mob/living/L in T)
if(creator)
add_attack_logs(creator, L, "Resonance field'ed")
to_chat(L, "<span class='userdanger'>[src] ruptured with you in it!</span>")
L.apply_damage(resonance_damage, BRUTE)
qdel(src)
/obj/effect/temp_visual/resonance_crush
icon_state = "shield1"
layer = ABOVE_ALL_MOB_LAYER
duration = 4
/obj/effect/temp_visual/resonance_crush/New()
..()
transform = matrix()*1.5
animate(src, transform = matrix() * 0.1, alpha = 50, time = 4)
@@ -0,0 +1,14 @@
/**********************Mining Equipment Vendor Items**************************/
//misc stuff you can buy from the vendor that has special code but doesn't really need its own file
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
item_state = "facehugger_inactive"
desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
throwforce = 0
real = 0
sterile = 1
tint = 3 //Makes it feel more authentic when it latches on
/obj/item/clothing/mask/facehugger/toy/Die()
return
@@ -0,0 +1,77 @@
/**********************Jaunter**********************/
/obj/item/wormhole_jaunter
name = "wormhole jaunter"
desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
icon = 'icons/obj/items.dmi'
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
origin_tech = "bluespace=2"
slot_flags = SLOT_BELT
/obj/item/wormhole_jaunter/attack_self(mob/user)
user.visible_message("<span class='notice'>[user.name] activates the [name]!</span>")
activate(user, TRUE)
/obj/item/wormhole_jaunter/proc/turf_check(mob/user)
var/turf/device_turf = get_turf(user)
if(!device_turf || !is_teleport_allowed(device_turf.z))
to_chat(user, "<span class='notice'>You're having difficulties getting the [name] to work.</span>")
return FALSE
return TRUE
/obj/item/wormhole_jaunter/proc/get_destinations(mob/user)
var/list/destinations = list()
for(var/obj/item/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(is_station_level(T.z))
destinations += B
return destinations
/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
if(!turf_check(user))
return
var/list/L = get_destinations(user)
if(!L.len)
to_chat(user, "<span class='notice'>The [name] found no beacons in the world to anchor a wormhole to.</span>")
return
var/chosen_beacon = pick(L)
var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100)
if(adjacent)
try_move_adjacent(J)
else
J.teleport(user)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
/obj/item/wormhole_jaunter/proc/chasm_react(mob/user)
if(user.get_item_by_slot(slot_belt) == src)
to_chat(user, "Your [name] activates, saving you from the chasm!</span>")
activate(user, FALSE)
else
to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.</span>")
/obj/effect/portal/jaunt_tunnel
name = "jaunt tunnel"
icon = 'icons/effects/effects.dmi'
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
failchance = 0
/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
. = ..()
if(.)
// KERPLUNK
playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1)
if(iscarbon(M))
var/mob/living/carbon/L = M
L.Weaken(6)
if(ishuman(L))
shake_camera(L, 20, 1)
addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
File diff suppressed because it is too large Load Diff
-44
View File
@@ -1,44 +0,0 @@
/****************Explorer's Suit and Mask****************/
/obj/item/clothing/suit/hooded/explorer
name = "explorer suit"
desc = "An armoured suit for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/explorer
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi'
)
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = HEAD
flags = BLOCKHAIR | NODROP
flags_cover = HEADCOVERSEYES
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Drask" = 'icons/mob/species/drask/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi',
"Skrell" = 'icons/mob/species/skrell/head.dmi'
)
+195
View File
@@ -0,0 +1,195 @@
GLOBAL_LIST_EMPTY(total_extraction_beacons)
/obj/item/extraction_pack
name = "fulton extraction pack"
desc = "A balloon that can be used to extract equipment or personnel to a Fulton Recovery Beacon. Anything not bolted down can be moved. Link the pack to a beacon by using the pack in hand."
icon = 'icons/obj/fulton.dmi'
icon_state = "extraction_pack"
w_class = WEIGHT_CLASS_NORMAL
var/obj/structure/extraction_point/beacon
var/list/beacon_networks = list("station")
var/uses_left = 3
var/can_use_indoors
var/safe_for_living_creatures = TRUE
var/max_force_fulton = MOVE_FORCE_STRONG
/obj/item/extraction_pack/examine(mob/user)
..()
to_chat(user, "It has [uses_left] use\s remaining.")
/obj/item/extraction_pack/attack_self(mob/user)
var/list/possible_beacons = list()
for(var/B in GLOB.total_extraction_beacons)
var/obj/structure/extraction_point/EP = B
if(EP.beacon_network in beacon_networks)
possible_beacons += EP
if(!possible_beacons.len)
to_chat(user, "There are no extraction beacons in existence!")
return
else
var/A
A = input("Select a beacon to connect to", "Balloon Extraction Pack", A) as null|anything in possible_beacons
if(!A)
return
beacon = A
to_chat(user, "You link the extraction pack to the beacon system.")
/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params)
. = ..()
if(!beacon)
to_chat(user, "<span class='warning'>[src] is not linked to a beacon, and cannot be used!</span>")
return
if(!can_use_indoors)
var/area/area = get_area(A)
if(!area.outdoors)
to_chat(user, "<span class='warning'>[src] can only be used on things that are outdoors!</span>")
return
if(!flag)
return
if(!istype(A))
return
else
if(!safe_for_living_creatures && check_for_living_mobs(A))
to_chat(user, "<span class='warning'>[src] is not safe for use with living creatures, they wouldn't survive the trip back!</span>")
return
if(!isturf(A.loc)) // no extracting stuff inside other stuff
return
if(A.anchored || (A.move_resist > max_force_fulton))
return
to_chat(user, "<span class='notice'>You start attaching the pack to [A]...</span>")
if(do_after(user, 50, target = A))
to_chat(user, "<span class='notice'>You attach the pack to [A] and activate it.</span>")
if(loc == user && istype(user.back, /obj/item/storage/backpack))
var/obj/item/storage/backpack/B = user.back
if(B.can_be_inserted(src, stop_messages = TRUE))
B.handle_item_insertion(src)
uses_left--
if(uses_left <= 0)
user.drop_item(src)
forceMove(A)
var/mutable_appearance/balloon
var/mutable_appearance/balloon2
var/mutable_appearance/balloon3
if(isliving(A))
var/mob/living/M = A
M.Weaken(16) // Keep them from moving during the duration of the extraction
M.buckled = 0 // Unbuckle them to prevent anchoring problems
else
A.anchored = TRUE
A.density = FALSE
var/obj/effect/extraction_holder/holder_obj = new(A.loc)
holder_obj.appearance = A.appearance
A.forceMove(holder_obj)
balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand")
balloon2.pixel_y = 10
balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
holder_obj.add_overlay(balloon2)
sleep(4)
balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon")
balloon.pixel_y = 10
balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
holder_obj.cut_overlay(balloon2)
holder_obj.add_overlay(balloon)
playsound(holder_obj.loc, 'sound/items/fultext_deploy.ogg', 50, 1, -3)
animate(holder_obj, pixel_z = 10, time = 20)
sleep(20)
animate(holder_obj, pixel_z = 15, time = 10)
sleep(10)
animate(holder_obj, pixel_z = 10, time = 10)
sleep(10)
animate(holder_obj, pixel_z = 15, time = 10)
sleep(10)
animate(holder_obj, pixel_z = 10, time = 10)
sleep(10)
playsound(holder_obj.loc, 'sound/items/fultext_launch.ogg', 50, 1, -3)
animate(holder_obj, pixel_z = 1000, time = 30)
if(ishuman(A))
var/mob/living/carbon/human/L = A
L.SetParalysis(0)
L.drowsyness = 0
L.SetSleeping(0)
sleep(30)
var/list/flooring_near_beacon = list()
for(var/turf/floor in orange(1, beacon))
if(floor.density)
continue
flooring_near_beacon += floor
holder_obj.forceMove(pick(flooring_near_beacon))
animate(holder_obj, pixel_z = 10, time = 50)
sleep(50)
animate(holder_obj, pixel_z = 15, time = 10)
sleep(10)
animate(holder_obj, pixel_z = 10, time = 10)
sleep(10)
balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract")
balloon3.pixel_y = 10
balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
holder_obj.cut_overlay(balloon)
holder_obj.add_overlay(balloon3)
sleep(4)
holder_obj.cut_overlay(balloon3)
A.anchored = FALSE // An item has to be unanchored to be extracted in the first place.
A.density = initial(A.density)
animate(holder_obj, pixel_z = 0, time = 5)
sleep(5)
A.forceMove(holder_obj.loc)
qdel(holder_obj)
if(uses_left <= 0)
qdel(src)
/obj/item/fulton_core
name = "extraction beacon signaller"
desc = "Emits a signal which fulton recovery devices can lock onto. Activate in hand to create a beacon."
icon = 'icons/obj/stock_parts.dmi'
icon_state = "subspace_amplifier"
/obj/item/fulton_core/attack_self(mob/user)
if(do_after(user, 15, target = user) && !QDELETED(src))
new /obj/structure/extraction_point(get_turf(user))
qdel(src)
/obj/structure/extraction_point
name = "fulton recovery beacon"
desc = "A beacon for the fulton recovery system. Activate a pack in your hand to link it to a beacon."
icon = 'icons/obj/fulton.dmi'
icon_state = "extraction_point"
anchored = TRUE
density = FALSE
var/beacon_network = "station"
/obj/structure/extraction_point/New()
..()
name += " ([rand(100,999)]) ([get_location_name(src)])"
GLOB.total_extraction_beacons += src
/obj/structure/extraction_point/Destroy()
GLOB.total_extraction_beacons -= src
return ..()
/obj/effect/extraction_holder
name = "extraction holder"
desc = "you shouldnt see this"
var/atom/movable/stored_obj
/obj/item/extraction_pack/proc/check_for_living_mobs(atom/A)
if(isliving(A))
var/mob/living/L = A
if(L.stat != DEAD)
return TRUE
for(var/thing in A.GetAllContents())
if(isliving(A))
var/mob/living/L = A
if(L.stat != DEAD)
return TRUE
return FALSE
/obj/effect/extraction_holder/singularity_pull()
return
/obj/effect/extraction_holder/singularity_pull()
return
@@ -15,6 +15,15 @@
if(4)
new /obj/item/dragons_blood(src)
/obj/structure/closet/crate/necropolis/dragon/crusher
name = "firey dragon chest"
/obj/structure/closet/crate/necropolis/dragon/crusher/New()
..()
new /obj/item/crusher_trophy/tail_spike(src)
// Spectral Blade
/obj/item/melee/ghost_sword
@@ -3,6 +3,8 @@
/obj/structure/closet/crate/necropolis/bubblegum/New()
..()
new /obj/item/clothing/suit/space/hostile_environment(src)
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
var/loot = rand(1,3)
switch(loot)
if(1)
@@ -12,6 +14,13 @@
if(3)
new /obj/item/gun/magic/staff/spellblade(src)
/obj/structure/closet/crate/necropolis/bubblegum/crusher
name = "bloody bubblegum chest"
/obj/structure/closet/crate/necropolis/bubblegum/crusher/New()
..()
new /obj/item/crusher_trophy/demon_claws(src)
// Mayhem
/obj/item/mayhem
@@ -1,3 +1,22 @@
//Colossus
/obj/structure/closet/crate/necropolis/colossus
name = "colossus chest"
/obj/structure/closet/crate/necropolis/colossus/New()
..()
var/list/choices = subtypesof(/obj/machinery/anomalous_crystal)
var/random_crystal = pick(choices)
new random_crystal(src)
new /obj/item/organ/internal/vocal_cords/colossus(src)
/obj/structure/closet/crate/necropolis/colossus/crusher
name = "angelic colossus chest"
/obj/structure/closet/crate/necropolis/colossus/crusher/New()
..()
new /obj/item/crusher_trophy/blaster_tubes(src)
//Black Box
/obj/machinery/smartfridge/black_box
@@ -8,18 +8,18 @@
icon_closed = "necrocrate"
burn_state = LAVA_PROOF | FIRE_PROOF
unacidable = 1
/obj/structure/closet/crate/necropolis/tendril
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/New(add_loot = TRUE)
..()
if(!add_loot)
return
var/loot = rand(1,24)
switch(loot)
var/loot = rand(1,25)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
if(2)
@@ -37,13 +37,15 @@
new /obj/item/clothing/suit/hooded/cultrobes(src)
new /obj/item/bedsheet/cult(src)
if(8)
new /obj/item/organ/internal/brain/xeno(src)
if(prob(50))
new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src)
else
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
if(9)
new /obj/item/organ/internal/heart/cursed/wizard(src)
if(10)
new /obj/item/ship_in_a_bottle(src)
if(11)
new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker(src)
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker(src)
if(12)
new /obj/item/sord(src)
@@ -54,7 +56,10 @@
if(15)
new /obj/item/guardiancreator(src)
if(16)
new /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs(src)
if(prob(50))
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
else
new /obj/item/disk/design_disk/modkit_disc/bounty(src)
if(17)
new /obj/item/warp_cube/red(src)
if(18)
@@ -69,10 +74,12 @@
new /obj/item/grenade/clusterbuster/inferno(src)
if(23)
new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor(src)
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
if(24)
new /obj/item/spellbook/oneuse/summonitem(src)
if(25)
new /obj/item/borg/upgrade/modkit/lifesteal(src)
new /obj/item/bedsheet/cult(src)
/obj/structure/closet/crate/necropolis/puzzle
name = "puzzling chest"
@@ -88,3 +95,63 @@
new /obj/item/wisp_lantern(src)
if(3)
new /obj/item/prisoncube(src)
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
name = "KA Mod Disk"
desc = "A design disc containing the design for a unique kinetic accelerator modkit. It's compatible with a research console."
icon_state = "datadisk1"
var/modkit_design = /datum/design/unique_modkit
/obj/item/disk/design_disk/modkit_disc/New()
. = ..()
blueprint = new modkit_design
/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe
name = "Offensive Mining Explosion Mod Disk"
modkit_design = /datum/design/unique_modkit/offensive_turf_aoe
/obj/item/disk/design_disk/modkit_disc/rapid_repeater
name = "Rapid Repeater Mod Disk"
modkit_design = /datum/design/unique_modkit/rapid_repeater
/obj/item/disk/design_disk/modkit_disc/resonator_blast
name = "Resonator Blast Mod Disk"
modkit_design = /datum/design/unique_modkit/resonator_blast
/obj/item/disk/design_disk/modkit_disc/bounty
name = "Death Syphon Mod Disk"
modkit_design = /datum/design/unique_modkit/bounty
/datum/design/unique_modkit
category = list("Mining", "Cyborg Upgrade Modules") //can't be normally obtained
build_type = PROTOLATHE | MECHFAB
/datum/design/unique_modkit/offensive_turf_aoe
name = "Kinetic Accelerator Offensive Mining Explosion Mod"
desc = "A device which causes kinetic accelerators to fire AoE blasts that destroy rock and damage creatures."
id = "hyperaoemod"
materials = list(MAT_METAL = 7000, MAT_GLASS = 3000, MAT_SILVER= 3000, MAT_GOLD = 3000, MAT_DIAMOND = 4000)
build_path = /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
/datum/design/unique_modkit/rapid_repeater
name = "Kinetic Accelerator Rapid Repeater Mod"
desc = "A device which greatly reduces a kinetic accelerator's cooldown on striking a living target or rock, but greatly increases its base cooldown."
id = "repeatermod"
materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_URANIUM = 8000, MAT_BLUESPACE = 2000)
build_path = /obj/item/borg/upgrade/modkit/cooldown/repeater
/datum/design/unique_modkit/resonator_blast
name = "Kinetic Accelerator Resonator Blast Mod"
desc = "A device which causes kinetic accelerators to fire shots that leave and detonate resonator blasts."
id = "resonatormod"
materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_SILVER= 5000, MAT_URANIUM = 5000)
build_path = /obj/item/borg/upgrade/modkit/resonator_blasts
/datum/design/unique_modkit/bounty
name = "Kinetic Accelerator Death Syphon Mod"
desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it."
id = "bountymod"
materials = list(MAT_METAL = 4000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_BLUESPACE = 4000)
reagents_list = list("blood" = 40)
build_path = /obj/item/borg/upgrade/modkit/bounty
+1 -1
View File
@@ -7,7 +7,7 @@
var/output_dir = SOUTH
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
S.forceMove(loc)
S.forceMove(drop_location())
var/turf/T = get_step(src,output_dir)
if(T)
S.forceMove(T)
+391
View File
@@ -0,0 +1,391 @@
/**********************Ore Redemption Unit**************************/
//Turns all the various mining machines into a single unit to speed up mining and establish a point system
/obj/machinery/mineral/ore_redemption
name = "ore redemption machine"
desc = "A machine that accepts ore and instantly transforms it into workable material sheets. Points for ore are generated based on type and can be redeemed at a mining equipment vendor."
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "ore_redemption"
density = TRUE
anchored = TRUE
input_dir = NORTH
output_dir = SOUTH
req_access = list(access_mineral_storeroom)
speed_process = TRUE
layer = BELOW_OBJ_LAYER
var/req_access_reclaim = access_mining_station
var/obj/item/card/id/inserted_id
var/points = 0
var/ore_pickup_rate = 15
var/sheet_per_ore = 1
var/point_upgrade = 1
var/list/ore_values = list("sand" = 1, "iron" = 1, "plasma" = 15, "silver" = 16, "gold" = 18, "titanium" = 30, "uranium" = 30, "diamond" = 50, "bluespace crystal" = 50, "bananium" = 60, "tranquillite" = 60)
var/message_sent = FALSE
var/list/ore_buffer = list()
var/datum/research/files
var/obj/item/disk/design_disk/inserted_disk
var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold"))
/obj/machinery/mineral/ore_redemption/New()
..()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack)
files = new /datum/research/smelter(src)
component_parts = list()
component_parts += new /obj/item/circuitboard/ore_redemption(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/micro_laser(null)
component_parts += new /obj/item/assembly/igniter(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/mineral/ore_redemption/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/ore_redemption(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/assembly/igniter(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/mineral/ore_redemption/golem
req_access = list(access_free_golems)
req_access_reclaim = access_free_golems
/obj/machinery/mineral/ore_redemption/golem/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/ore_redemption/golem(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/micro_laser(null)
component_parts += new /obj/item/assembly/igniter(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/mineral/ore_redemption/Destroy()
QDEL_NULL(files)
GET_COMPONENT(materials, /datum/component/material_container)
materials.retrieve_all()
return ..()
/obj/machinery/mineral/ore_redemption/RefreshParts()
var/ore_pickup_rate_temp = 15
var/point_upgrade_temp = 1
var/sheet_per_ore_temp = 1
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
sheet_per_ore_temp = 0.65 + (0.35 * B.rating)
for(var/obj/item/stock_parts/manipulator/M in component_parts)
ore_pickup_rate_temp = 15 * M.rating
for(var/obj/item/stock_parts/micro_laser/L in component_parts)
point_upgrade_temp = 0.65 + (0.35 * L.rating)
ore_pickup_rate = ore_pickup_rate_temp
point_upgrade = point_upgrade_temp
sheet_per_ore = sheet_per_ore_temp
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
ore_buffer -= O
if(O && O.refined_type)
points += O.points * point_upgrade * O.amount
GET_COMPONENT(materials, /datum/component/material_container)
var/material_amount = materials.get_item_material_amount(O)
if(!material_amount)
qdel(O) //no materials, incinerate it
else if(!materials.has_space(material_amount * sheet_per_ore * O.amount)) //if there is no space, eject it
unload_mineral(O)
else
materials.insert_item(O, sheet_per_ore) //insert it
qdel(O)
/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
if(D.make_reagents.len)
return FALSE
var/build_amount = 0
GET_COMPONENT(materials, /datum/component/material_container)
for(var/mat_id in D.materials)
var/M = D.materials[mat_id]
var/datum/material/redemption_mat = materials.materials[mat_id]
if(!M || !redemption_mat)
return FALSE
var/smeltable_sheets = round(redemption_mat.amount / M)
if(!smeltable_sheets)
return FALSE
if(!build_amount)
build_amount = smeltable_sheets
build_amount = min(build_amount, smeltable_sheets)
return build_amount
/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
var/current_amount = 0
for(var/ore in ores_to_process)
if(current_amount >= ore_pickup_rate)
break
smelt_ore(ore)
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
if(!is_station_level(z))
return
message_sent = TRUE
var/area/A = get_area(src)
var/msg = "Now available in [A]:<br>"
var/has_minerals = FALSE
var/mineral_name = null
GET_COMPONENT(materials, /datum/component/material_container)
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
mineral_name = capitalize(M.name)
if(mineral_amount)
has_minerals = TRUE
msg += "[mineral_name]: [mineral_amount] sheets<br>"
if(!has_minerals)
return
for(var/obj/machinery/requests_console/D in allConsoles)
if(D.department in src.supply_consoles)
if(supply_consoles[D.department] == null || (mineral_name in supply_consoles[D.department]))
D.createMessage("Ore Redemption Machine", "New Minerals Available!", msg, 1)
/obj/machinery/mineral/ore_redemption/process()
if(panel_open || !powered())
return
var/atom/input = get_step(src, input_dir)
var/obj/structure/ore_box/OB = locate() in input
if(OB)
input = OB
for(var/obj/item/stack/ore/O in input)
if(QDELETED(O))
continue
ore_buffer |= O
O.forceMove(src)
CHECK_TICK
if(LAZYLEN(ore_buffer))
message_sent = FALSE
process_ores(ore_buffer)
else if(!message_sent)
send_console_message()
/obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params)
if(exchange_parts(user, W))
return
if(default_unfasten_wrench(user, W))
return
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
updateUsrDialog()
return
if(default_deconstruction_crowbar(W))
return
if(!powered())
return
if(istype(W, /obj/item/card/id))
var/obj/item/card/id/I = user.get_active_hand()
if(istype(I) && !istype(inserted_id))
if(!user.drop_item())
return
I.forceMove(src)
inserted_id = I
interact(user)
return
if(ismultitool(W) && panel_open)
input_dir = turn(input_dir, -90)
output_dir = turn(output_dir, -90)
to_chat(user, "<span class='notice'>You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].</span>")
return
if(istype(W, /obj/item/disk/design_disk))
if(user.drop_item())
W.forceMove(src)
inserted_disk = W
interact(user)
return TRUE
return ..()
/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/mineral/ore_redemption/interact(mob/user)
var/dat = "This machine only accepts ore. Gibtonite and Slag are not accepted.<br><br>"
dat += "Current unclaimed points: [points]<br>"
if(inserted_id)
dat += "You have [inserted_id.mining_points] mining points collected. <A href='?src=[UID()];eject_id=1'>Eject ID.</A><br>"
dat += "<A href='?src=[UID()];claim=1'>Claim points.</A><br><br>"
else
dat += "No ID inserted. <A href='?src=[UID()];insert_id=1'>Insert ID.</A><br><br>"
GET_COMPONENT(materials, /datum/component/material_container)
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
if(M.amount)
var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
dat += "[capitalize(M.name)]: [sheet_amount] "
if(sheet_amount >= 1)
dat += "<A href='?src=[UID()];release=[mat_id]'>Release</A><br>"
else
dat += "<span class='linkOff'>Release</span><br>"
dat += "<br><b>Alloys: </b><br>"
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(can_smelt_alloy(D))
dat += "[D.name]: <A href='?src=[UID()];alloy=[D.id]'>Smelt</A><br>"
else
dat += "[D.name]: <span class='linkOff'>Smelt</span><br>"
dat += "<br><div class='statusDisplay'><b>Mineral Value List:</b><br>[get_ore_values()]</div>"
if(inserted_disk)
dat += "<A href='?src=[UID()];eject_disk=1'>Eject disk</A><br>"
dat += "<div class='statusDisplay'><b>Uploadable designs: </b><br>"
if(inserted_disk.blueprint)
var/datum/design/D = inserted_disk.blueprint
if(D.build_type & SMELTER)
dat += "Name: [D.name] <A href='?src=[UID()];upload=[inserted_disk.blueprint]'>Upload to smelter</A>"
dat += "</div><br>"
else
dat += "<A href='?src=[UID()];insert_disk=1'>Insert design disk</A><br><br>"
var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
popup.set_content(dat)
popup.open()
return
/obj/machinery/mineral/ore_redemption/proc/get_ore_values()
var/dat = "<table border='0' width='300'>"
for(var/ore in ore_values)
var/value = ore_values[ore]
dat += "<tr><td>[capitalize(ore)]</td><td>[value * point_upgrade]</td></tr>"
dat += "</table>"
return dat
/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
if(..())
return
GET_COMPONENT(materials, /datum/component/material_container)
if(href_list["eject_id"])
usr.put_in_hands(inserted_id)
inserted_id = null
if(href_list["claim"])
if(inserted_id)
if(req_access_reclaim in inserted_id.access)
inserted_id.mining_points += points
points = 0
else
to_chat(usr, "<span class='warning'>Required access not found.</span>")
else if(href_list["insert_id"])
var/obj/item/card/id/I = usr.get_active_hand()
if(istype(I))
if(!usr.drop_item())
return
I.forceMove(src)
inserted_id = I
else
to_chat(usr, "<span class='warning'>Not a valid ID!</span>")
if(href_list["eject_disk"])
if(inserted_disk)
inserted_disk.forceMove(loc)
inserted_disk = null
if(href_list["insert_disk"])
var/obj/item/disk/design_disk/D = usr.get_active_hand()
if(istype(D))
if(!usr.drop_item())
return
D.forceMove(src)
inserted_disk = D
if(href_list["upload"])
if(inserted_disk && inserted_disk.blueprint)
files.AddDesign2Known(inserted_disk.blueprint)
if(href_list["release"])
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
var/mat_id = href_list["release"]
if(!materials.materials[mat_id])
return
var/datum/material/mat = materials.materials[mat_id]
var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
if(!stored_amount)
return
var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
var/sheets_to_remove = round(min(desired,50,stored_amount))
var/out = get_step(src, output_dir)
materials.retrieve_sheets(sheets_to_remove, mat_id, out)
else
to_chat(usr, "<span class='warning'>Required access not found.</span>")
if(href_list["alloy"])
var/alloy_id = href_list["alloy"]
var/datum/design/alloy = files.FindDesignByID(alloy_id)
if((check_access(inserted_id) || allowed(usr)) && alloy)
var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
return
var/smelt_amount = can_smelt_alloy(alloy)
var/amount = round(min(desired,50,smelt_amount))
materials.use_amount(alloy.materials, amount)
var/output = new alloy.build_path(src)
if(istype(output, /obj/item/stack/sheet))
var/obj/item/stack/sheet/mineral/produced_alloy = output
produced_alloy.amount = amount
unload_mineral(produced_alloy)
else
unload_mineral(output)
else
to_chat(usr, "<span class='warning'>Required access not found.</span>")
updateUsrDialog()
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
do_sparks(5, 1, src)
if(severity == 1)
if(prob(50))
qdel(src)
else if(severity == 2)
if(prob(25))
qdel(src)
/obj/machinery/mineral/ore_redemption/power_change()
..()
update_icon()
if(inserted_id && !powered())
visible_message("<span class='notice'>The ID slot indicator light flickers on [src] as it spits out a card before powering down.</span>")
inserted_id.forceMove(loc)
/obj/machinery/mineral/ore_redemption/update_icon()
if(powered())
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-off"
+311
View File
@@ -0,0 +1,311 @@
/**********************Mining Equipment Locker**************************/
/obj/machinery/mineral/equipment_vendor
name = "mining equipment vendor"
desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "mining"
density = 1
anchored = 1.0
var/obj/item/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500),
new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800),
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200),
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
)
/obj/machinery/mineral/equipment_vendor/golem
name = "golem ship equipment vendor"
/obj/machinery/mineral/equipment_vendor/golem/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/mineral/equipment_vendor/golem/Initialize()
. = ..()
desc += "\nIt seems a few selections have been added."
prize_list += list(
new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250),
new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250),
new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250),
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000),
new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000),
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
)
/datum/data/mining_equipment
var/equipment_name = "generic"
var/equipment_path = null
var/cost = 0
/datum/data/mining_equipment/New(name, path, equipment_cost)
equipment_name = name
equipment_path = path
cost = equipment_cost
/obj/machinery/mineral/equipment_vendor/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/mining_equipment_vendor(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/mineral/equipment_vendor/power_change()
..()
update_icon()
if(inserted_id && !powered())
visible_message("<span class='notice'>The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.</span>")
inserted_id.forceMove(loc)
/obj/machinery/mineral/equipment_vendor/update_icon()
if(powered())
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-off"
/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
interact(user)
/obj/machinery/mineral/equipment_vendor/interact(mob/user)
user.set_machine(src)
var/dat
dat +="<div class='statusDisplay'>"
if(istype(inserted_id))
dat += "You have [inserted_id.mining_points] mining points collected. <A href='?src=[UID()];choice=eject'>Eject ID.</A><br>"
else
dat += "No ID inserted. <A href='?src=[UID()];choice=insert'>Insert ID.</A><br>"
dat += "</div>"
dat += "<br><b>Equipment point cost list:</b><BR><table border='0' width='200'>"
for(var/datum/data/mining_equipment/prize in prize_list)
dat += "<tr><td>[prize.equipment_name]</td><td>[prize.cost]</td><td><A href='?src=[UID()];purchase=\ref[prize]'>Purchase</A></td></tr>"
dat += "</table>"
var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
popup.set_content(dat)
popup.open()
/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
if(..())
return 1
if(href_list["choice"])
if(istype(inserted_id))
if(href_list["choice"] == "eject")
inserted_id.loc = loc
inserted_id.verb_pickup()
inserted_id = null
else if(href_list["choice"] == "insert")
var/obj/item/card/id/I = usr.get_active_hand()
if(istype(I))
if(!usr.drop_item())
return
I.loc = src
inserted_id = I
else
to_chat(usr, "<span class='danger'>No valid ID.</span>")
if(href_list["purchase"])
if(istype(inserted_id))
var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points)
return
inserted_id.mining_points -= prize.cost
new prize.equipment_path(src.loc)
updateUsrDialog()
/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
updateUsrDialog()
return
if(panel_open)
if(istype(I, /obj/item/crowbar))
if(inserted_id)
inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
default_deconstruction_crowbar(I)
return 1
if(istype(I, /obj/item/mining_voucher))
if(!powered())
return
else
RedeemVoucher(I, user)
return
if(istype(I,/obj/item/card/id))
if(!powered())
return
else
var/obj/item/card/id/C = usr.get_active_hand()
if(istype(C) && !istype(inserted_id))
if(!usr.drop_item())
return
C.forceMove(src)
inserted_id = C
interact(user)
return
..()
/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer)
var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit")
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items
if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
return
var/drop_location = drop_location()
switch(selection)
if("Survival Capsule and Explorer's Webbing")
new /obj/item/storage/belt/mining(drop_location)
if("Resonator Kit")
new /obj/item/extinguisher/mini(drop_location)
new /obj/item/resonator(drop_location)
if("Minebot Kit")
new /obj/item/mining_drone_cube(drop_location)
new /obj/item/weldingtool/hugetank(drop_location)
new /obj/item/clothing/head/welding(drop_location)
if("Extraction and Rescue Kit")
new /obj/item/extraction_pack(drop_location)
new /obj/item/fulton_core(drop_location)
new /obj/item/stack/marker_beacon/thirty(drop_location)
if("Crusher Kit")
new /obj/item/extinguisher/mini(drop_location)
new /obj/item/twohanded/kinetic_crusher(drop_location)
if("Mining Conscription Kit")
new /obj/item/storage/backpack/duffel/mining_conscript(drop_location)
qdel(voucher)
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
do_sparks(5, 1, src)
if(prob(50 / severity) && severity < 3)
qdel(src)
/**********************Mining Equipment Locker Items**************************/
/**********************Mining Equipment Voucher**********************/
/obj/item/mining_voucher
name = "mining voucher"
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
icon = 'icons/obj/items.dmi'
icon_state = "mining_voucher"
w_class = WEIGHT_CLASS_TINY
/**********************Mining Point Card**********************/
/obj/item/card/mining_point_card
name = "mining point card"
desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard."
icon_state = "data"
var/points = 500
/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/card/id))
if(points)
var/obj/item/card/id/C = I
C.mining_points += points
to_chat(user, "<span class='info'>You transfer [points] points to [C].</span>")
points = 0
else
to_chat(user, "<span class='info'>There's no points left on [src].</span>")
..()
/obj/item/card/mining_point_card/examine(mob/user)
..(user)
to_chat(user, "There's [points] points on the card.")
/**********************Conscription Kit**********************/
/obj/item/card/id/mining_access_card
name = "mining access card"
desc = "A small card, that when used on any ID, will add mining access."
icon_state = "data_1"
/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity)
. = ..()
if(istype(AM, /obj/item/card/id) && proximity)
var/obj/item/card/id/I = AM
I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo)
to_chat(user, "You upgrade [I] with mining access.")
qdel(src)
/obj/item/storage/backpack/duffel/mining_conscript
name = "mining conscription kit"
desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
/obj/item/storage/backpack/duffel/mining_conscript/New()
..()
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/storage/bag/ore(src)
new /obj/item/clothing/suit/hooded/explorer(src)
new /obj/item/encryptionkey/headset_cargo(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/id/mining_access_card(src)
new /obj/item/gun/energy/kinetic_accelerator(src)
new /obj/item/kitchen/knife/combat/survival(src)
new /obj/item/flashlight/seclite(src)
+12 -221
View File
@@ -17,35 +17,20 @@
icon_closed = "mixed"
/obj/structure/closet/wardrobe/miner/New()
..()
contents = list()
new /obj/item/storage/backpack/duffel(src)
new /obj/item/storage/backpack/industrial(src)
new /obj/item/storage/backpack/satchel_eng(src)
new /obj/item/clothing/under/rank/miner(src)
new /obj/item/clothing/under/rank/miner(src)
new /obj/item/clothing/under/rank/miner(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/gloves/fingerless(src)
/obj/structure/closet/wardrobe/miner/lavaland
/obj/structure/closet/wardrobe/miner/lavaland/New()
..()
contents = list()
new /obj/item/storage/backpack/duffel(src)
new /obj/item/storage/backpack/explorer(src)
new /obj/item/storage/backpack/explorer(src)
new /obj/item/storage/backpack/satchel/explorer(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
new /obj/item/clothing/shoes/workboots/mining(src)
new /obj/item/clothing/shoes/workboots/mining(src)
new /obj/item/clothing/shoes/workboots/mining(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
@@ -59,14 +44,18 @@
/obj/structure/closet/secure_closet/miner/New()
..()
// new /obj/item/stack/sheet/mineral/sandbags(src, 5)
// new /obj/item/storage/box/emptysandbags(src)
new /obj/item/shovel(src)
new /obj/item/pickaxe(src)
new /obj/item/pickaxe/mini(src)
new /obj/item/radio/headset/headset_cargo/mining(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/flashlight/seclite(src)
new /obj/item/storage/bag/plants(src)
new /obj/item/storage/bag/ore(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/gun/energy/kinetic_accelerator(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/survivalcapsule(src)
new /obj/item/stack/marker_beacon/ten
/**********************Shuttle Computer**************************/
@@ -86,148 +75,6 @@
desc = "A mining lantern."
brightness_on = 6 // luminosity when on
/*****************************Pickaxe********************************/
/obj/item/pickaxe
name = "pickaxe"
icon = 'icons/obj/items.dmi'
icon_state = "pickaxe"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 15
throwforce = 10
item_state = "pickaxe"
w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
origin_tech = "materials=2;engineering=3"
attack_verb = list("hit", "pierced", "sliced", "attacked")
var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
var/drill_verb = "picking"
sharp = 1
var/excavation_amount = 100
usesound = 'sound/effects/picaxe1.ogg'
toolspeed = 1
/obj/item/pickaxe/proc/playDigSound()
playsound(src, pick(digsound),20,1)
/obj/item/pickaxe/emergency
name = "emergency disembarkation tool"
desc = "For extracting yourself from rough landings."
/obj/item/pickaxe/safety
name = "safety pickaxe"
desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."
force = 1
throwforce = 1
attack_verb = list("ineffectively hit")
/obj/item/pickaxe/silver
name = "silver-plated pickaxe"
icon_state = "spickaxe"
item_state = "spickaxe"
origin_tech = "materials=3;engineering=4"
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
toolspeed = 0.75
/obj/item/pickaxe/gold
name = "golden pickaxe"
icon_state = "gpickaxe"
item_state = "gpickaxe"
origin_tech = "materials=4;engineering=4"
desc = "A gold-plated pickaxe that mines faster than standard-issue."
toolspeed = 0.6
/obj/item/pickaxe/diamond
name = "diamond-tipped pickaxe"
icon_state = "dpickaxe"
item_state = "dpickaxe"
origin_tech = "materials=5;engineering=4"
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
toolspeed = 0.5
/obj/item/pickaxe/drill
name = "mining drill"
icon_state = "handdrill"
item_state = "jackhammer"
digsound = list('sound/weapons/drill.ogg')
hitsound = 'sound/weapons/drill.ogg'
usesound = 'sound/weapons/drill.ogg'
origin_tech = "materials=2;powerstorage=2;engineering=3"
desc = "An electric mining drill for the especially scrawny."
toolspeed = 0.5
/obj/item/pickaxe/drill/cyborg
name = "cyborg mining drill"
desc = "An integrated electric mining drill."
flags = NODROP
/obj/item/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
icon_state = "diamonddrill"
origin_tech = "materials=6;powerstorage=4;engineering=4"
desc = "Yours is the drill that will pierce the heavens!"
toolspeed = 0.25
/obj/item/pickaxe/diamonddrill/traitor //Pocket-sized traitor diamond drill.
name = "supermatter drill"
icon_state = "smdrill"
origin_tech = "materials=6;powerstorage=4;engineering=4;syndicate=3"
desc = "Microscopic supermatter crystals cover the head of this tiny drill."
w_class = WEIGHT_CLASS_SMALL
/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
icon_state = "diamonddrill"
toolspeed = 0.25
/obj/item/pickaxe/drill/jackhammer
name = "sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
usesound = 'sound/weapons/sonic_jackhammer.ogg'
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
toolspeed = 0.1
/*****************************Shovel********************************/
/obj/item/shovel
name = "shovel"
desc = "A large tool for digging and moving dirt."
icon = 'icons/obj/items.dmi'
icon_state = "shovel"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 8
throwforce = 4
item_state = "shovel"
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=50)
origin_tech = "materials=2;engineering=2"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
usesound = 'sound/effects/shovel_dig.ogg'
toolspeed = 1
/obj/item/shovel/spade
name = "spade"
desc = "A small tool for digging and moving dirt."
icon_state = "spade"
item_state = "spade"
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
toolspeed = 2
/obj/item/shovel/safety
name = "safety shovel"
desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."
force = 1
throwforce = 1
attack_verb = list("ineffectively hit")
/**********************Mining car (Crate like thing, not the rail car)**************************/
/obj/structure/closet/crate/miningcar
@@ -236,60 +83,4 @@
icon_state = "miningcar"
density = 1
icon_opened = "miningcaropen"
icon_closed = "miningcar"
/*********************Mob Capsule*************************/
/obj/item/mobcapsule
name = "lazarus capsule"
desc = "It allows you to store and deploy lazarus-injected creatures easier."
icon = 'icons/obj/mobcap.dmi'
icon_state = "mobcap0"
w_class = WEIGHT_CLASS_TINY
throw_range = 20
var/mob/living/simple_animal/captured = null
var/colorindex = 0
/obj/item/mobcapsule/Destroy()
if(captured)
captured.ghostize()
QDEL_NULL(captured)
return ..()
/obj/item/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
if(!istype(A, /mob/living/simple_animal) || isbot(A))
return ..()
capture(A, user)
return 1
/obj/item/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob)
var/mob/living/simple_animal/T = target
if(captured)
to_chat(U, "<span class='notice'>Capture failed!</span>: The capsule already has a mob registered to it!")
else
if(istype(T) && "neutral" in T.faction)
T.forceMove(src)
T.name = "[U.name]'s [initial(T.name)]"
T.cancel_camera()
name = "Lazarus Capsule: [initial(T.name)]"
to_chat(U, "<span class='notice'>You placed a [T.name] inside the Lazarus Capsule!</span>")
captured = T
else
to_chat(U, "You can't capture that mob!")
/obj/item/mobcapsule/throw_impact(atom/A, mob/user)
..()
if(captured)
dump_contents(user)
/obj/item/mobcapsule/proc/dump_contents(mob/user)
if(captured)
captured.forceMove(get_turf(src))
captured = null
/obj/item/mobcapsule/attack_self(mob/user)
colorindex += 1
if(colorindex >= 6)
colorindex = 0
icon_state = "mobcap[colorindex]"
update_icon()
icon_closed = "miningcar"
+105 -71
View File
@@ -5,6 +5,7 @@
/mob/living/simple_animal/hostile/mining_drone
name = "nanotrasen minebot"
desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder."
gender = NEUTER
icon = 'icons/obj/aibots.dmi'
icon_state = "mining_drone"
icon_living = "mining_drone"
@@ -14,36 +15,31 @@
a_intent = INTENT_HARM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
wander = 0
idle_vision_range = 5
move_to_delay = 10
retreat_distance = 1
minimum_distance = 2
health = 125
maxHealth = 125
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 0
obj_damage = 10
environment_smash = 0
check_friendly_fire = 1
stop_automated_movement_when_pulled = 1
check_friendly_fire = TRUE
stop_automated_movement_when_pulled = TRUE
attacktext = "drills"
attack_sound = 'sound/weapons/circsawhit.ogg'
ranged = 1
sentience_type = SENTIENCE_MINEBOT
ranged_message = "shoots"
ranged_cooldown_time = 30
projectiletype = /obj/item/projectile/kinetic
projectilesound = 'sound/weapons/gunshots/gunshot4.ogg'
speak_emote = list("states")
wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
/obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron,
/obj/item/stack/ore/bananium, /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/glass,
/obj/item/stack/ore/titanium)
healable = 0
loot = list(/obj/effect/decal/cleanable/robot_debris)
del_on_death = TRUE
var/mode = MINEDRONE_COLLECT
var/light_on = 0
var/mesons_active
var/obj/item/gun/energy/kinetic_accelerator/minebot/stored_gun
var/datum/action/innate/minedrone/toggle_light/toggle_light_action
var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
@@ -52,6 +48,8 @@
/mob/living/simple_animal/hostile/mining_drone/New()
..()
stored_gun = new(src)
zone_sel = new /obj/screen/zone_sel(src) //Gross, but necessary TO-DO; remove this.
toggle_light_action = new()
toggle_light_action.Grant(src)
toggle_meson_vision_action = new()
@@ -72,8 +70,27 @@
..()
check_friendly_fire = 0
/mob/living/simple_animal/hostile/mining_drone/examine(mob/user)
. = ..()
var/t_He = p_they(TRUE)
var/t_him = p_them()
var/t_s = p_s()
if(health < maxHealth)
if(health >= maxHealth * 0.5)
. += "<span class='warning'>[t_He] look[t_s] slightly dented.</span>"
else
. += "<span class='boldwarning'>[t_He] look[t_s] severely dented!</span>"
. += {"<span class='notice'>Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. <b>[max(0, LAZYLEN(contents) - 1)] Stored Ore</b>\n
Field repairs can be done with a welder."}
if(stored_gun && stored_gun.max_mod_capacity)
. += "<b>[stored_gun.get_remaining_mod_capacity()]%</b> mod capacity remaining."
for(var/A in stored_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
. += "<span class='notice'>There is \a [M] installed, using <b>[M.cost]%</b> capacity.</span>"
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP)
if(iswelder(I) && user.a_intent == INTENT_HELP)
var/obj/item/weldingtool/W = I
if(W.welding && !stat)
if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
@@ -90,29 +107,18 @@
to_chat(user, "<span class='info'>You instruct [src] to drop any collected ore.</span>")
DropOre()
return
if(iscrowbar(I) || istype(I, /obj/item/borg/upgrade/modkit))
I.melee_attack_chain(user, stored_gun, params)
return
..()
/mob/living/simple_animal/hostile/mining_drone/death()
// Only execute the below if we successfully died
. = ..()
if(!.)
return FALSE
visible_message("<span class='danger'>[src] is destroyed!</span>")
new /obj/effect/decal/cleanable/blood/gibs/robot(loc)
DropOre(0)
qdel(src)
/mob/living/simple_animal/hostile/mining_drone/Shoot(atom/targeted_atom)
var/obj/item/projectile/kinetic/K = ..()
var/turf/proj_turf = get_turf(K)
if(!isturf(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
if(pressure > 50)
K.name = "weakened [K.name]"
K.damage *= K.pressure_decrease
if(stored_gun)
for(var/obj/item/borg/upgrade/modkit/M in stored_gun.modkits)
M.uninstall(stored_gun)
deathmessage = "blows apart!"
. = ..()
/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
if(M.a_intent == INTENT_HELP)
@@ -125,12 +131,24 @@
return
..()
/mob/living/simple_animal/hostile/mining_drone/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/kinetic))
var/obj/item/projectile/kinetic/K = O
if(K.kinetic_gun)
for(var/A in K.kinetic_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, /obj/item/borg/upgrade/modkit/minebot_passthrough))
return TRUE
if(istype(O, /obj/item/projectile/destabilizer))
return TRUE
return ..()
/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior()
mode = MINEDRONE_COLLECT
idle_vision_range = 9
search_objects = 2
wander = 1
ranged = 0
wander = TRUE
ranged = FALSE
minimum_distance = 1
retreat_distance = null
icon_state = "mining_drone"
@@ -140,18 +158,25 @@
mode = MINEDRONE_ATTACK
idle_vision_range = 7
search_objects = 0
wander = 0
ranged = 1
retreat_distance = 1
minimum_distance = 2
wander = FALSE
ranged = TRUE
retreat_distance = 2
minimum_distance = 1
icon_state = "mining_drone_offense"
to_chat(src, "<span class='info'>You are set to attack mode. You can now attack from range.</span>")
/mob/living/simple_animal/hostile/mining_drone/AttackingTarget()
if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT)
if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT)
CollectOre()
return
..()
if(isliving(target))
SetOffenseBehavior()
return ..()
/mob/living/simple_animal/hostile/mining_drone/OpenFire(atom/A)
if(CheckFriendlyFire(A))
return
stored_gun.afterattack(A, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best?
/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
for(var/obj/item/stack/ore/O in range(1, src))
@@ -160,14 +185,12 @@
/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
if(!contents.len)
if(message)
to_chat(src, "<span class='notice'>You attempt to dump your stored ore, but you have none.</span>")
to_chat(src, "<span class='warning'>You attempt to dump your stored ore, but you have none.</span>")
return
if(message)
to_chat(src, "<span class='notice'>You dump your stored ore.</span>")
for(var/obj/item/stack/ore/O in contents)
contents -= O
O.forceMove(loc)
return
O.forceMove(drop_location())
/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount)
if(mode != MINEDRONE_ATTACK && amount > 0)
@@ -176,13 +199,10 @@
/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode()
switch(mode)
if(MINEDRONE_COLLECT)
SetOffenseBehavior()
if(MINEDRONE_ATTACK)
SetCollectBehavior()
else //This should never happen.
mode = MINEDRONE_COLLECT
SetCollectBehavior()
else
SetOffenseBehavior()
//Actions for sentient minebots
@@ -264,42 +284,26 @@
if(M.melee_damage_upper != initial(M.melee_damage_upper))
to_chat(user, "[M] already has a combat upgrade installed!")
return
M.melee_damage_lower = 22
M.melee_damage_upper = 22
M.melee_damage_lower += 7
M.melee_damage_upper += 7
to_chat(user, "You upgrade [M]'s combat module.")
qdel(src)
//Health
/obj/item/mine_bot_upgrade/health
name = "minebot chassis upgrade"
name = "minebot armor upgrade"
/obj/item/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(M.maxHealth != initial(M.maxHealth))
to_chat(user, "[M] already has a reinforced chassis!")
return
var/previous = M.maxHealth
M.maxHealth = 170
M.health += M.maxHealth - previous
to_chat(user, "You reinforce [M]'s chassis.")
M.maxHealth += 45
M.updatehealth()
qdel(src)
//Cooldown
/obj/item/mine_bot_upgrade/cooldown
name = "minebot cooldown upgrade"
/obj/item/mine_bot_upgrade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(M.ranged_cooldown_time != initial(M.ranged_cooldown_time))
to_chat(user, "[M] already has a decreased weapon cooldown!")
return
M.ranged_cooldown_time = 10
to_chat(user, "You upgrade [M]'s ranged weaponry, reducing its cooldown.")
qdel(src)
//AI
/obj/item/slimepotion/sentience/mining
name = "minebot AI upgrade"
desc = "Can be used to grant sentience to minebots."
@@ -307,6 +311,36 @@
icon = 'icons/obj/doors/door_assembly.dmi'
sentience_type = SENTIENCE_MINEBOT
origin_tech = "programming=6"
var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values
var/base_damage_add = 1 //this thus disables other minebot upgrades
var/base_speed_add = 1
var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module
/obj/item/slimepotion/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/SM)
if(istype(SM, /mob/living/simple_animal/hostile/mining_drone))
var/mob/living/simple_animal/hostile/mining_drone/M = SM
M.maxHealth = initial(M.maxHealth) + base_health_add
M.melee_damage_lower = initial(M.melee_damage_lower) + base_damage_add
M.melee_damage_upper = initial(M.melee_damage_upper) + base_damage_add
M.move_to_delay = initial(M.move_to_delay) + base_speed_add
if(M.stored_gun)
M.stored_gun.overheat_time += base_cooldown_add
/**********************Mining drone cube**********************/
/obj/item/mining_drone_cube
name = "mining drone cube"
desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/aibots.dmi'
icon_state = "minedronecube"
item_state = "electronic"
/obj/item/mining_drone_cube/attack_self(mob/user)
user.visible_message("<span class='warning'>\The [src] suddenly expands into a fully functional mining drone!</span>", \
"<span class='warning'>You press center button on \the [src]. The device suddenly expands into a fully functional mining drone!</span>")
new /mob/living/simple_animal/hostile/mining_drone(get_turf(src))
qdel(src)
#undef MINEDRONE_COLLECT
#undef MINEDRONE_ATTACK
#undef MINEDRONE_ATTACK
@@ -303,8 +303,165 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
qdel(src)
/obj/item/stack/ore/ex_act()
return
/obj/item/stack/ore/ex_act(severity)
if(!severity || severity >= 2)
return
qdel(src)
/*****************************Coin********************************/
/obj/item/coin
icon = 'icons/obj/economy.dmi'
name = "coin"
icon_state = "coin__heads"
flags = CONDUCT
force = 1
throwforce = 2
w_class = WEIGHT_CLASS_TINY
var/string_attached
var/list/sideslist = list("heads","tails")
var/cmineral = null
var/cooldown = 0
var/credits = 10
/obj/item/coin/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
icon_state = "coin_[cmineral]_[sideslist[1]]"
if(cmineral)
name = "[cmineral] coin"
/obj/item/coin/gold
cmineral = "gold"
icon_state = "coin_gold_heads"
materials = list(MAT_GOLD = 400)
credits = 160
/obj/item/coin/silver
cmineral = "silver"
icon_state = "coin_silver_heads"
materials = list(MAT_SILVER = 400)
credits = 40
/obj/item/coin/diamond
cmineral = "diamond"
icon_state = "coin_diamond_heads"
materials = list(MAT_DIAMOND = 400)
credits = 120
/obj/item/coin/iron
cmineral = "iron"
icon_state = "coin_iron_heads"
materials = list(MAT_METAL = 400)
credits = 20
/obj/item/coin/plasma
cmineral = "plasma"
icon_state = "coin_plasma_heads"
materials = list(MAT_PLASMA = 400)
credits = 80
/obj/item/coin/uranium
cmineral = "uranium"
icon_state = "coin_uranium_heads"
materials = list(MAT_URANIUM = 400)
credits = 160
/obj/item/coin/clown
cmineral = "bananium"
icon_state = "coin_bananium_heads"
materials = list(MAT_BANANIUM = 400)
credits = 600 //makes the clown cri
/obj/item/coin/mime
cmineral = "tranquillite"
icon_state = "coin_tranquillite_heads"
materials = list(MAT_TRANQUILLITE = 400)
credits = 600 //makes the mime cri
/obj/item/coin/adamantine
cmineral = "adamantine"
icon_state = "coin_adamantine_heads"
credits = 400
/obj/item/coin/mythril
cmineral = "mythril"
icon_state = "coin_mythril_heads"
credits = 400
/obj/item/coin/twoheaded
cmineral = "iron"
icon_state = "coin_iron_heads"
desc = "Hey, this coin's the same on both sides!"
sideslist = list("heads")
credits = 20
/obj/item/coin/antagtoken
name = "antag token"
icon_state = "coin_valid_valid"
cmineral = "valid"
desc = "A novelty coin that helps the heart know what hard evidence cannot prove."
sideslist = list("valid", "salad")
credits = 20
/obj/item/coin/antagtoken/syndicate
name = "syndicate coin"
credits = 160
/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
if(string_attached)
to_chat(user, "<span class='notice'>There already is a string attached to this coin.</span>")
return
if(CC.use(1))
overlays += image('icons/obj/economy.dmi',"coin_string_overlay")
string_attached = 1
to_chat(user, "<span class='notice'>You attach a string to the coin.</span>")
else
to_chat(user, "<span class='warning'>You need one length of cable to attach a string to the coin.</span>")
return
else if(istype(W,/obj/item/wirecutters))
if(!string_attached)
..()
return
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
CC.amount = 1
CC.update_icon()
overlays = list()
string_attached = null
to_chat(user, "<span class='notice'>You detach the string from the coin.</span>")
else if(istype(W,/obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
if(WT.welding && WT.remove_fuel(0, user))
var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
"silver" = /obj/item/clothing/gloves/ring/silver,
"gold" = /obj/item/clothing/gloves/ring/gold,
"plasma" = /obj/item/clothing/gloves/ring/plasma,
"uranium" = /obj/item/clothing/gloves/ring/uranium)
var/typekey = typelist[cmineral]
if(ispath(typekey))
to_chat(user, "<span class='notice'>You make [src] into a ring.</span>")
new typekey(get_turf(loc))
qdel(src)
else ..()
/obj/item/coin/attack_self(mob/user as mob)
if(cooldown < world.time - 15)
var/coinflip = pick(sideslist)
cooldown = world.time
flick("coin_[cmineral]_flip", src)
icon_state = "coin_[cmineral]_[coinflip]"
playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
if(do_after(user, 15, target = src))
user.visible_message("<span class='notice'>[user] has flipped [src]. It lands on [coinflip].</span>", \
"<span class='notice'>You flip [src]. It lands on [coinflip].</span>", \
"<span class='notice'>You hear the clattering of loose change.</span>")
#undef GIBTONITE_QUALITY_LOW
#undef GIBTONITE_QUALITY_MEDIUM
+22 -1
View File
@@ -29,6 +29,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/seedarkness = TRUE
var/data_hud_seen = FALSE //this should one of the defines in __DEFINES/hud.dm
var/ghost_orbit = GHOST_ORBIT_CIRCLE
var/health_scan = FALSE //does the ghost have health scanner mode on? by default it should be off
/mob/dead/observer/New(var/mob/body=null, var/flags=1)
set_invisibility(GLOB.observer_default_invisibility)
@@ -236,6 +237,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 1
/mob/dead/observer/Move(NewLoc, direct)
update_parallax_contents()
following = null
setDir(direct)
ghostimage.setDir(dir)
@@ -417,6 +419,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
forceMove(pick(L))
update_parallax_contents()
following = null
/mob/dead/observer/verb/follow()
@@ -511,6 +514,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
A.forceMove(T)
M.update_parallax_contents()
following = null
return
to_chat(A, "This mob is not located in the game world.")
@@ -537,6 +542,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set hidden = 1
to_chat(src, "<span class='warning'>You are dead! You have no mind to store memory!</span>")
/mob/dead/observer/verb/toggle_health_scan()
set name = "Toggle Health Scan"
set desc = "Toggles whether you health-scan living beings on click"
set category = "Ghost"
if(health_scan) //remove old huds
to_chat(src, "<span class='notice'>Health scan disabled.</span>")
health_scan = FALSE
else
to_chat(src, "<span class='notice'>Health scan enabled.</span>")
health_scan = TRUE
/mob/dead/observer/verb/analyze_air()
set name = "Analyze Air"
set category = "Ghost"
@@ -761,14 +779,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/proc/incarnate_ghost()
if(!client)
return
var/mob/living/carbon/human/new_char = new(get_turf(src))
client.prefs.copy_to(new_char)
if(mind)
mind.active = 1
mind.active = TRUE
mind.transfer_to(new_char)
else
new_char.key = key
return new_char
/mob/dead/observer/is_literate()
return TRUE
+1
View File
@@ -1128,6 +1128,7 @@ so that different stomachs can handle things in different ways VB*/
var/obj/item/clothing/C = I
if(C.tint || initial(C.tint))
update_tint()
update_sight()
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
@@ -1877,6 +1877,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. = ..()
. += "---"
.["Set Species"] = "?_src_=vars;setspecies=[UID()]"
.["Copy Outfit"] = "?_src_=vars;copyoutfit=[UID()]"
.["Make AI"] = "?_src_=vars;makeai=[UID()]"
.["Make cyborg"] = "?_src_=vars;makerobot=[UID()]"
.["Make monkey"] = "?_src_=vars;makemonkey=[UID()]"
@@ -141,19 +141,19 @@ emp_act
if(l_hand && !istype(l_hand, /obj/item/clothing))
var/final_block_chance = l_hand.block_chance - (Clamp((armour_penetration-l_hand.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(r_hand && !istype(r_hand, /obj/item/clothing))
var/final_block_chance = r_hand.block_chance - (Clamp((armour_penetration-r_hand.armour_penetration)/2,0,100)) + block_chance_modifier //Need to reset the var so it doesn't carry over modifications between attempts
if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(wear_suit)
var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier
if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(w_uniform)
var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier
if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
return 0
@@ -525,4 +525,4 @@ emp_act
if(head)
to_chat(src, "<span class='danger'>Your [head.name] protects you from the [hot ? "hot" : "cold"] liquid!</span>")
return FALSE
return TRUE
return TRUE
@@ -63,7 +63,8 @@
else
//No oldFP or it's a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
createFootprintsFrom(shoes, dir, T)
if(S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD)
createFootprintsFrom(shoes, dir, T)
update_inv_shoes()
else if(hasfeet)
if(bloody_feet && bloody_feet[blood_state])
@@ -72,7 +73,8 @@
return
else
bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP)
createFootprintsFrom(src, dir, T)
if(bloody_feet[blood_state] > BLOOD_LOSS_IN_SPREAD)
createFootprintsFrom(src, dir, T)
update_inv_shoes()
//End bloody footprints
if(S)
@@ -567,3 +567,10 @@
return 0
return O.equip(src, visualsOnly)
//delete all equipment without dropping anything
/mob/living/carbon/human/proc/delete_equipment()
for(var/slot in get_all_slots())//order matters, dependant slots go first
qdel(slot)
for(var/obj/item/I in l_hand, r_hand)
qdel(I)
@@ -6,21 +6,19 @@
dangerous_existence = TRUE //So so much
//language = "Clatter"
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
species_traits = list(IS_WHITELISTED, RADIMMUNE, NO_BLOOD, NOTRANSSTING)
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
//default_mutations=list(SKELETON) // This screws things up
butt_sprite = "plasma"
breathid = "tox"
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
heat_level_3 = 500 // Heat damage level 3 above this point.
burn_mod = 1.5
heatmod = 1.5
brute_mod = 1.5
//Has default darksight of 2.
@@ -48,136 +46,118 @@
message = replacetext(message, "s", stutter("ss"))
return message
/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/assigned_role = H.mind && H.mind.assigned_role ? H.mind.assigned_role : "Civilian"
// Unequip existing suits and hats.
H.unEquip(H.wear_suit)
H.unEquip(H.head)
if(assigned_role != "Clown")
H.unEquip(H.wear_mask)
H.equip_or_collect(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
var/suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
var/tank_slot = slot_s_store
var/tank_slot_name = "suit storage"
switch(assigned_role)
if("Scientist","Roboticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
if("Geneticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
if("Research Director")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
if("Station Engineer", "Mechanic")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
if("Chief Engineer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
if("Life Support Specialist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
if("Detective")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
if("Warden","Security Officer","Security Pod Pilot")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
if("Internal Affairs Agent")
suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
if("Magistrate")
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
if("Head of Security", "Special Operations Officer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
if("Captain", "Blueshield")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
if("Head of Personnel")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
if("Nanotrasen Representative", "Nanotrasen Navy Officer")
suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
if("Medical Doctor","Brig Physician","Virologist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
if("Paramedic")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
if("Chemist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
if("Chief Medical Officer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
if("Coroner")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
if("Virologist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
if("Bartender", "Chef")
suit=/obj/item/clothing/suit/space/eva/plasmaman/service
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service
if("Cargo Technician", "Quartermaster")
suit=/obj/item/clothing/suit/space/eva/plasmaman/cargo
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
if("Shaft Miner")
suit=/obj/item/clothing/suit/space/eva/plasmaman/explorer
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
if("Botanist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/botanist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
var/current_job = J.title
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
switch(current_job)
if("Chaplain")
suit=/obj/item/clothing/suit/space/eva/plasmaman/chaplain
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
if("Janitor")
suit=/obj/item/clothing/suit/space/eva/plasmaman/janitor
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
if("Civilian", "Barber")
suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
if("Clown")
suit=/obj/item/clothing/suit/space/eva/plasmaman/clown
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
if("Mime")
suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
if("Syndicate Officer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/nuclear
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
O = new /datum/outfit/plasmaman/chaplain
if((H.mind.special_role == SPECIAL_ROLE_WIZARD) || (H.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))
H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/wizard(H), slot_wear_suit)
H.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard(H), slot_head)
else
H.equip_or_collect(new suit(H), slot_wear_suit)
H.equip_or_collect(new helm(H), slot_head)
H.equip_or_collect(new /obj/item/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
H.equip_or_collect(new /obj/item/plasmensuit_cartridge(H), slot_in_backpack)
H.equip_or_collect(new /obj/item/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
to_chat(H, "<span class='notice'>You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.</span>")
H.internal = H.get_item_by_slot(tank_slot)
if("Librarian")
O = new /datum/outfit/plasmaman/librarian
if("Janitor")
O = new /datum/outfit/plasmaman/janitor
if("Botanist")
O = new /datum/outfit/plasmaman/botany
if("Bartender", "Internal Affairs Agent", "Magistrate", "Nanotrasen Representative", "Nanotrasen Navy Officer")
O = new /datum/outfit/plasmaman/bar
if("Chef")
O = new /datum/outfit/plasmaman/chef
if("Security Officer", "Security Pod Pilot", "Special Operations Officer")
O = new /datum/outfit/plasmaman/security
if("Detective")
O = new /datum/outfit/plasmaman/detective
if("Warden")
O = new /datum/outfit/plasmaman/warden
if("Head of Security")
O = new /datum/outfit/plasmaman/hos
if("Cargo Technician", "Quartermaster")
O = new /datum/outfit/plasmaman/cargo
if("Shaft Miner")
O = new /datum/outfit/plasmaman/mining
if("Medical Doctor", "Brig Physician", "Paramedic", "Coroner")
O = new /datum/outfit/plasmaman/medical
if("Chief Medical Officer")
O = new /datum/outfit/plasmaman/cmo
if("Chemist")
O = new /datum/outfit/plasmaman/chemist
if("Geneticist")
O = new /datum/outfit/plasmaman/genetics
if("Roboticist")
O = new /datum/outfit/plasmaman/robotics
if("Virologist")
O = new /datum/outfit/plasmaman/viro
if("Scientist")
O = new /datum/outfit/plasmaman/science
if("Research Director")
O = new /datum/outfit/plasmaman/rd
if("Station Engineer", "Mechanic")
O = new /datum/outfit/plasmaman/engineering
if("Chief Engineer")
O = new /datum/outfit/plasmaman/ce
if("Life Support Specialist")
O = new /datum/outfit/plasmaman/atmospherics
if("Mime")
O = new /datum/outfit/plasmaman/mime
if("Clown")
O = new /datum/outfit/plasmaman/clown
if("Head of Personnel")
O = new /datum/outfit/plasmaman/hop
if("Captain")
O = new /datum/outfit/plasmaman/captain
if("Blueshield")
O = new /datum/outfit/plasmaman/blueshield
H.equipOutfit(O, visualsOnly)
H.internal = H.r_hand
H.update_action_buttons_icon()
return FALSE
/datum/species/plasmaman/handle_life(mob/living/carbon/human/H)
if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
var/datum/gas_mixture/environment = H.loc.return_air()
if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.IgniteMob()
var/datum/gas_mixture/environment = H.loc.return_air()
var/atmos_sealed = FALSE
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
var/obj/item/clothing/CS = H.wear_suit
var/obj/item/clothing/CH = H.head
if (CS.flags & CH.flags & STOPSPRESSUREDMAGE)
atmos_sealed = TRUE
if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
if(environment)
if(environment.total_moles())
if(environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Same threshhold that extinguishes fire
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.IgniteMob()
else
if(H.on_fire && H.fire_stacks > 0)
var/obj/item/clothing/suit/space/eva/plasmaman/P = H.wear_suit
if(H.fire_stacks)
var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
H.update_fire()
@@ -7,19 +7,19 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
..()
return ..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
..()
return ..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
..()
return ..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
if(dna.species)
amount = amount * dna.species.stun_mod
..()
return ..()
@@ -586,7 +586,8 @@ var/global/list/damage_icon_parts = list()
standing.overlays += image("icon" = A.sprite_sheets[dna.species.name], "icon_state" = "[A.icon_state]")
else
standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
standing.alpha = w_uniform.alpha
standing.color = w_uniform.color
overlays_standing[UNIFORM_LAYER] = standing
else
// Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY
@@ -716,12 +717,13 @@ var/global/list/damage_icon_parts = list()
l_ear.screen_loc = ui_l_ear //...draw the item in the inventory screen
client.screen += l_ear //Either way, add the item to the HUD
var/t_type = l_ear.icon_state
var/t_type = l_ear.item_state
if(!t_type)
t_type = l_ear.icon_state
if(l_ear.icon_override)
t_type = "[t_type]_l"
overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.icon_override, "[t_type]", layer = -EARS_LAYER)
else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name])
t_type = "[t_type]_l"
overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER)
else
overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER)
@@ -732,12 +734,13 @@ var/global/list/damage_icon_parts = list()
r_ear.screen_loc = ui_r_ear //...draw the item in the inventory screen
client.screen += r_ear //Either way, add the item to the HUD
var/t_type = r_ear.icon_state
var/t_type = r_ear.item_state
if(!t_type)
t_type = r_ear.icon_state
if(r_ear.icon_override)
t_type = "[t_type]_r"
overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.icon_override, "[t_type]", layer = -EARS_LAYER)
else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name])
t_type = "[t_type]_r"
overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER)
else
overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER)
@@ -769,6 +772,8 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
standing.alpha = shoes.alpha
standing.color = shoes.color
overlays_standing[SHOES_LAYER] = standing
else
if(feet_blood_DNA)
@@ -819,6 +824,8 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color
standing.overlays += bloodsies
standing.alpha = head.alpha
standing.color = head.color
overlays_standing[HEAD_LAYER] = standing
apply_overlay(HEAD_LAYER)
@@ -886,6 +893,8 @@ var/global/list/damage_icon_parts = list()
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
standing.alpha = wear_suit.alpha
standing.color = wear_suit.color
overlays_standing[SUIT_LAYER] = standing
apply_overlay(SUIT_LAYER)
@@ -931,27 +940,31 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
var/obj/item/organ/external/head/head_organ = get_organ("head")
var/datum/sprite_accessory/alt_heads/alternate_head
if(head_organ.alt_head && head_organ.alt_head != "None")
alternate_head = GLOB.alt_heads_list[head_organ.alt_head]
if(!(slot_wear_mask in check_obscured_slots()))
var/obj/item/organ/external/head/head_organ = get_organ("head")
var/datum/sprite_accessory/alt_heads/alternate_head
if(head_organ.alt_head && head_organ.alt_head != "None")
alternate_head = GLOB.alt_heads_list[head_organ.alt_head]
var/mutable_appearance/standing
var/icon/mask_icon = new(wear_mask.icon)
if(wear_mask.icon_override)
mask_icon = new(wear_mask.icon_override)
standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
else
standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
var/mutable_appearance/standing
var/icon/mask_icon = new(wear_mask.icon)
if(wear_mask.icon_override)
mask_icon = new(wear_mask.icon_override)
standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
else
standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
bloodsies.color = wear_mask.blood_color
standing.overlays += bloodsies
overlays_standing[FACEMASK_LAYER] = standing
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
bloodsies.color = wear_mask.blood_color
standing.overlays += bloodsies
standing.alpha = wear_mask.alpha
standing.color = wear_mask.color
overlays_standing[FACEMASK_LAYER] = standing
apply_overlay(FACEMASK_LAYER)
@@ -973,6 +986,8 @@ var/global/list/damage_icon_parts = list()
standing = mutable_appearance('icons/mob/back.dmi', "[back.icon_state]", layer = -BACK_LAYER)
//create the image
standing.alpha = back.alpha
standing.color = back.color
overlays_standing[BACK_LAYER] = standing
apply_overlay(BACK_LAYER)
@@ -1006,9 +1021,14 @@ var/global/list/damage_icon_parts = list()
if(!t_state)
t_state = r_hand.icon_state
var/mutable_appearance/I = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER)
I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
overlays_standing[R_HAND_LAYER] = I
var/mutable_appearance/standing
if(r_hand.sprite_sheets_inhand && r_hand.sprite_sheets_inhand[dna.species.name])
t_state = "[t_state]_r"
standing = mutable_appearance(r_hand.sprite_sheets_inhand[dna.species.name], "[t_state]", layer = -R_HAND_LAYER)
else
standing = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER)
standing = center_image(standing, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
overlays_standing[R_HAND_LAYER] = standing
apply_overlay(R_HAND_LAYER)
@@ -1020,9 +1040,14 @@ var/global/list/damage_icon_parts = list()
if(!t_state)
t_state = l_hand.icon_state
var/mutable_appearance/I = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER)
I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
overlays_standing[L_HAND_LAYER] = I
var/mutable_appearance/standing
if(l_hand.sprite_sheets_inhand && l_hand.sprite_sheets_inhand[dna.species.name])
t_state = "[t_state]_l"
standing = mutable_appearance(l_hand.sprite_sheets_inhand[dna.species.name], "[t_state]", layer = -L_HAND_LAYER)
else
standing = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER)
standing = center_image(standing, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
overlays_standing[L_HAND_LAYER] = standing
apply_overlay(L_HAND_LAYER)
//human HUD updates for items in our inventory
+1 -1
View File
@@ -332,7 +332,7 @@
break //Only count the first bedsheet
if(drunk)
comfort += 1 //Aren't naps SO much better when drunk?
AdjustDrunk(1-0.0015*comfort) //reduce drunkenness ~6% per two seconds, when on floor.
AdjustDrunk(-0.2*comfort) //reduce drunkenness while sleeping.
if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket.
adjustBruteLoss(-1*comfort)
adjustFireLoss(-1*comfort)
@@ -146,6 +146,44 @@
stat(null,"Power Level: [powerlevel]")
/mob/living/carbon/slime/updatehealth(reason)
. = ..()
update_health_hud()
/mob/living/carbon/slime/proc/update_health_hud()
if(hud_used)
var/severity = 0
var/healthpercent = (health/maxHealth) * 100
if(stat != DEAD)
switch(healthpercent)
if(100 to INFINITY)
healths.icon_state = "slime_health0"
if(80 to 100)
healths.icon_state = "slime_health1"
severity = 1
if(60 to 80)
healths.icon_state = "slime_health2"
severity = 2
if(40 to 60)
healths.icon_state = "slime_health3"
severity = 3
if(20 to 40)
healths.icon_state = "slime_health4"
severity = 4
if(0 to 20)
healths.icon_state = "slime_health5"
severity = 5
if(-199 to 0)
healths.icon_state = "slime_health6"
severity = 6
else
healths.icon_state = "slime_health7"
severity = 6
if(severity > 0)
overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
else
clear_fullscreen("brute")
/mob/living/carbon/slime/adjustFireLoss(amount)
..(-abs(amount)) // Heals them
return
+29 -1
View File
@@ -44,6 +44,22 @@
if(BRAIN)
return adjustBrainLoss(damage)
/mob/living/proc/get_damage_amount(damagetype = BRUTE)
switch(damagetype)
if(BRUTE)
return getBruteLoss()
if(BURN)
return getFireLoss()
if(TOX)
return getToxLoss()
if(OXY)
return getOxyLoss()
if(CLONE)
return getCloneLoss()
if(STAMINA)
return getStaminaLoss()
/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/stamina = 0)
if(blocked >= 100) return 0
if(brute) apply_damage(brute, BRUTE, def_zone, blocked)
@@ -309,4 +325,16 @@
updatehealth("take overall damage")
/mob/living/proc/has_organic_damage()
return (maxHealth - health)
return (maxHealth - health)
//heal up to amount damage, in a given order
/mob/living/proc/heal_ordered_damage(amount, list/damage_types)
. = amount //we'll return the amount of damage healed
for(var/i in damage_types)
var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have
if(amount_to_heal)
apply_damage_type(-amount_to_heal, i)
amount -= amount_to_heal //remove what we healed from our current amount
if(!amount)
break
. -= amount //if there's leftover healing, remove it from what we return
+2
View File
@@ -256,8 +256,10 @@
death()
to_chat(src, "<span class='notice'>You have given up life and succumbed to death.</span>")
/mob/living/proc/InCritical()
return (health < HEALTH_THRESHOLD_CRIT && health > HEALTH_THRESHOLD_DEAD && stat == UNCONSCIOUS)
/mob/living/ex_act(severity)
..()
@@ -31,6 +31,7 @@
ai.camera_visibility(src)
if(ai.client && !ai.multicam_on)
ai.client.eye = src
update_parallax_contents()
//Holopad
if(ai.master_multicam)
ai.master_multicam.refresh_view()
+2 -2
View File
@@ -107,6 +107,8 @@
aiRestorePowerRoutine = 0
update_blind_effects()
update_sight()
to_chat(src, "Here are your current laws:")
show_laws()
return
switch(PRP)
@@ -126,8 +128,6 @@
theAPC.attack_ai(src)
apc_override = 0
aiRestorePowerRoutine = 3
to_chat(src, "Here are your current laws:")
src.show_laws() //WHY THE FUCK IS THIS HERE
sleep(50)
theAPC = null
@@ -235,6 +235,12 @@
to_chat(user, "<span class='notice'>Body Temperature: ???</span>")
return
user.visible_message("<span class='notice'>[user] has analyzed [M]'s components.</span>","<span class='notice'>You have analyzed [M]'s components.</span>")
robot_healthscan(user, M)
add_fingerprint(user)
proc/robot_healthscan(mob/user, mob/living/M)
var/scan_type
if(istype(M, /mob/living/silicon/robot))
scan_type = "robot"
@@ -244,7 +250,7 @@
to_chat(user, "<span class='warning'>You can't analyze non-robotic things!</span>")
return
user.visible_message("<span class='notice'>[user] has analyzed [M]'s components.</span>","<span class='notice'>You have analyzed [M]'s components.</span>")
switch(scan_type)
if("robot")
var/BU = M.getFireLoss() > 50 ? "<b>[M.getFireLoss()]</b>" : M.getFireLoss()
@@ -308,5 +314,3 @@
to_chat(user, "<span class='notice'>Internal Fluid Level:[H.blood_volume]/[H.max_blood]</span>")
if(H.bleed_rate)
to_chat(user, "<span class='warning'>Warning:External component leak detected!</span>")
src.add_fingerprint(user)
@@ -576,6 +576,8 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/restrained()
return 0
/mob/living/silicon/robot/InCritical()
return low_power_mode
/mob/living/silicon/robot/ex_act(severity)
switch(severity)
@@ -883,6 +885,8 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/attack_ghost(mob/user)
if(wiresexposed)
wires.Interact(user)
else
..() //this calls the /mob/living/attack_ghost proc for the ghost health/cyborg analyzer
/mob/living/silicon/robot/proc/allowed(obj/item/I)
var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob
+2 -1
View File
@@ -337,4 +337,5 @@
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
/mob/living/silicon/can_hear()
. = TRUE
. = TRUE
@@ -165,7 +165,7 @@
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/armor/vest/blueshield,
/obj/item/clothing/suit/space/deathsquad,
/obj/item/clothing/suit/space/hardsuit/engineering,
/obj/item/clothing/suit/space/hardsuit/engine,
/obj/item/radio,
/obj/item/radio/off,
/obj/item/clothing/suit/cardborg,
@@ -356,7 +356,7 @@
desc = "That's not red paint. That's real corgi blood."
valid = 1
if(/obj/item/clothing/head/helmet/space/hardsuit/engineering)
if(/obj/item/clothing/suit/space/hardsuit/engine)
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
@@ -34,13 +34,29 @@
holder_type = /obj/item/holder/mouse
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
var/chew_probability = 1
/mob/living/simple_animal/mouse/Initialize(mapload)
. = ..()
AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100)
/mob/living/simple_animal/mouse/handle_automated_action()
if(prob(chew_probability))
var/turf/simulated/floor/F = get_turf(src)
if(istype(F) && !F.intact)
var/obj/structure/cable/C = locate() in F
if(C && prob(15))
if(C.avail())
visible_message("<span class='warning'>[src] chews through [C]. It's toast!</span>")
playsound(src, 'sound/effects/sparks2.ogg', 100, 1)
C.deconstruct()
toast() // mmmm toasty.
else
C.deconstruct()
visible_message("<span class='warning'>[src] chews through [C].</span>")
/mob/living/simple_animal/mouse/handle_automated_speech()
..()
..()
if(prob(speak_chance))
for(var/mob/M in view())
M << squeak_sound
@@ -98,7 +114,12 @@
to_chat(M, "<span class='notice'>[bicon(src)] Squeek!</span>")
..()
/mob/living/simple_animal/mouse/death(gibbed)
/mob/living/simple_animal/mouse/proc/toast()
add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY)
desc = "It's toast."
death()
/mob/living/simple_animal/mouse/death(gibbed)
// Only execute the below if we successfully died
playsound(src, squeak_sound, 40, 1)
. = ..(gibbed)
@@ -12,8 +12,8 @@
response_disarm = "shoos"
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
var/colour = "grey"
pass_flags = PASSTABLE
var/colour = "grey"
/mob/living/simple_animal/slime/adult
health = 200
@@ -24,3 +24,37 @@
/mob/living/simple_animal/slime/New()
..()
overlays += "aslime-:33"
/mob/living/simple_animal/slime/updatehealth(reason)
. = ..()
update_health_hud()
/mob/living/simple_animal/slime/proc/update_health_hud()
if(hud_used)
var/severity = 0
var/healthpercent = (health/maxHealth) * 100
switch(healthpercent)
if(100 to INFINITY)
healths.icon_state = "slime_health0"
if(80 to 100)
healths.icon_state = "slime_health1"
severity = 1
if(60 to 80)
healths.icon_state = "slime_health2"
severity = 2
if(40 to 60)
healths.icon_state = "slime_health3"
severity = 3
if(20 to 40)
healths.icon_state = "slime_health4"
severity = 4
if(1 to 20)
healths.icon_state = "slime_health5"
severity = 5
else
healths.icon_state = "slime_health7"
severity = 6
if(severity > 0)
overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
else
clear_fullscreen("brute")
@@ -1,100 +1,106 @@
#define EGG_INCUBATION_TIME 120
/mob/living/simple_animal/hostile/headcrab
name = "headslug"
desc = "Absolutely not de-beaked or harmless. Keep away from corpses."
name = "headcrab"
desc = "A small parasitic creature that would like to connect with your brain stem."
icon = 'icons/mob/headcrab.dmi'
icon_state = "headcrab"
icon_living = "headcrab"
icon_dead = "headcrab_dead"
icon = 'icons/mob/mob.dmi'
health = 50
maxHealth = 50
health = 40
maxHealth = 40
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
robust_searching = 1
stat_attack = 2
obj_damage = 0
environment_smash = 0
speak_emote = list("squeaks")
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
melee_damage_upper = 10
ranged = 1
ranged_message = "leaps"
ranged_cooldown_time = 40
var/jumpdistance = 4
var/jumpspeed = 1
attacktext = "bites"
attack_sound = 'sound/creatures/headcrab_attack.ogg'
speak_emote = list("hisses")
var/is_zombie = 0
stat_attack = 1 //so they continue to attack when they are on the ground.
var/host_species = ""
var/list/human_overlays = list()
/mob/living/simple_animal/hostile/headcrab/examine(mob/user)
/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired)
if(!is_zombie && isturf(src.loc) && stat != DEAD)
for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
Zombify(H)
break
..()
if(stat == DEAD)
to_chat(desc = "It appears to be dead.")
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
egg.insert(victim)
if(origin)
egg.origin = origin
else if(mind) // Let's make this a feature
egg.origin = mind
for(var/obj/item/organ/internal/I in src)
I.loc = egg
visible_message("<span class='warning'>[src] plants something in [victim]'s flesh!</span>", \
"<span class='danger'>We inject our egg into [victim]'s body!</span>")
egg_lain = 1
/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A)
if(check_friendly_fire)
for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory
for(var/mob/living/L in T)
if(L == src || L == A)
continue
if(faction_check(L) && !attack_same)
return
visible_message("<span class='danger'><b>[src]</b> [ranged_message] at [A]!</span>")
throw_at(A, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)
ranged_cooldown = world.time + ranged_cooldown_time
/mob/living/simple_animal/hostile/headcrab/AttackingTarget()
if(egg_lain)
target.attack_animal(src)
return
if(iscarbon(target) && !issmall(target))
// Changeling egg can survive in aliens!
var/mob/living/carbon/C = target
if(C.stat == DEAD)
if(C.status_flags & XENO_HOST)
to_chat(src, "<span class='userdanger'>A foreign presence repels us from this body. Perhaps we should try to infest another?</span>")
return
Infect(target)
to_chat(src, "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>")
spawn(100)
death()
return
target.attack_animal(src)
/mob/living/simple_animal/hostile/headcrab/proc/Zombify(mob/living/carbon/human/H)
if(!H.check_death_method())
H.death()
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
is_zombie = TRUE
if(H.wear_suit)
var/obj/item/clothing/suit/armor/A = H.wear_suit
if(A.armor && A.armor["melee"])
maxHealth += A.armor["melee"] //That zombie's got armor, I want armor!
maxHealth += 50
health = maxHealth
name = "zombie"
desc = "A corpse animated by the alien being on its head."
melee_damage_lower = 10
melee_damage_upper = 15
ranged = 0
icon = H.icon
speak = list('sound/creatures/zombie_idle1.ogg','sound/creatures/zombie_idle2.ogg','sound/creatures/zombie_idle3.ogg')
speak_chance = 50
speak_emote = list("groans")
attacktext = "bites"
attack_sound = 'sound/creatures/zombie_attack.ogg'
icon_state = "zombie2_s"
if(head_organ)
head_organ.h_style = null
H.update_hair()
host_species = H.dna.species.name
human_overlays = H.overlays
update_icons()
H.forceMove(src)
visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
/obj/item/organ/internal/body_egg/changeling_egg
name = "changeling egg"
desc = "Twitching and disgusting."
origin_tech = "biotech=7" // You need to be really lucky to obtain it.
var/datum/mind/origin
var/time
/obj/item/organ/internal/body_egg/changeling_egg/egg_process()
// Changeling eggs grow in dead people
time++
if(time >= EGG_INCUBATION_TIME)
Pop()
remove(owner)
/mob/living/simple_animal/hostile/headcrab/death()
..()
if(is_zombie)
qdel(src)
/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop()
var/mob/living/carbon/human/monkey/M = new(owner)
owner.stomach_contents += M
for(var/obj/item/organ/internal/I in src)
I.insert(M, 1)
/mob/living/simple_animal/hostile/headcrab/handle_automated_speech() // This way they have different screams when attacking, sometimes. Might be seen as sphagetthi code though.
if(speak_chance)
if(rand(0,200) < speak_chance)
if(speak && speak.len)
playsound(get_turf(src), pick(speak), 200, 1)
if(origin && origin.current && (origin.current.stat == DEAD))
origin.transfer_to(M)
if(!origin.changeling)
M.make_changeling()
if(origin.changeling.can_absorb_dna(M, owner))
origin.changeling.absorb_dna(owner, M)
/mob/living/simple_animal/hostile/headcrab/Destroy()
if(contents)
for(var/mob/M in contents)
M.loc = get_turf(src)
return ..()
var/datum/action/changeling/humanform/HF = new
HF.Grant(M)
for(var/power in origin.changeling.purchasedpowers)
var/datum/action/changeling/S = power
if(istype(S) && S.needs_button)
S.Grant(M)
M.key = origin.key
owner.gib()
#undef EGG_INCUBATION_TIME
/mob/living/simple_animal/hostile/headcrab/update_icons()
..()
if(is_zombie)
overlays.Cut()
overlays = human_overlays
var/image/I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod")
if(host_species == "Vox")
I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_vox")
else if(host_species == "Gray")
I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray")
overlays += I
@@ -0,0 +1,100 @@
#define EGG_INCUBATION_TIME 120
/mob/living/simple_animal/hostile/headslug
name = "headslug"
desc = "Absolutely not de-beaked or harmless. Keep away from corpses."
icon_state = "headslug"
icon_living = "headslug"
icon_dead = "headslug_dead"
icon = 'icons/mob/mob.dmi'
health = 50
maxHealth = 50
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
robust_searching = 1
stat_attack = 2
obj_damage = 0
environment_smash = 0
speak_emote = list("squeaks")
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
/mob/living/simple_animal/hostile/headslug/examine(mob/user)
..()
if(stat == DEAD)
to_chat(desc = "It appears to be dead.")
/mob/living/simple_animal/hostile/headslug/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
egg.insert(victim)
if(origin)
egg.origin = origin
else if(mind) // Let's make this a feature
egg.origin = mind
for(var/obj/item/organ/internal/I in src)
I.loc = egg
visible_message("<span class='warning'>[src] plants something in [victim]'s flesh!</span>", \
"<span class='danger'>We inject our egg into [victim]'s body!</span>")
egg_lain = 1
/mob/living/simple_animal/hostile/headslug/AttackingTarget()
if(egg_lain)
target.attack_animal(src)
return
if(iscarbon(target) && !issmall(target))
// Changeling egg can survive in aliens!
var/mob/living/carbon/C = target
if(C.stat == DEAD)
if(C.status_flags & XENO_HOST)
to_chat(src, "<span class='userdanger'>A foreign presence repels us from this body. Perhaps we should try to infest another?</span>")
return
Infect(target)
to_chat(src, "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>")
spawn(100)
death()
return
target.attack_animal(src)
/obj/item/organ/internal/body_egg/changeling_egg
name = "changeling egg"
desc = "Twitching and disgusting."
origin_tech = "biotech=7" // You need to be really lucky to obtain it.
var/datum/mind/origin
var/time
/obj/item/organ/internal/body_egg/changeling_egg/egg_process()
// Changeling eggs grow in dead people
time++
if(time >= EGG_INCUBATION_TIME)
Pop()
remove(owner)
qdel(src)
/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop()
var/mob/living/carbon/human/monkey/M = new(owner)
owner.stomach_contents += M
for(var/obj/item/organ/internal/I in src)
I.insert(M, 1)
if(origin && origin.current && (origin.current.stat == DEAD))
origin.transfer_to(M)
if(!origin.changeling)
M.make_changeling()
if(origin.changeling.can_absorb_dna(M, owner))
origin.changeling.absorb_dna(owner, M)
var/datum/action/changeling/humanform/HF = new
HF.Grant(M)
for(var/power in origin.changeling.purchasedpowers)
var/datum/action/changeling/S = power
if(istype(S) && S.needs_button)
S.Grant(M)
M.key = origin.key
owner.gib()
#undef EGG_INCUBATION_TIME
@@ -309,14 +309,18 @@
else
M.Goto(src,M.move_to_delay,M.minimum_distance)
/mob/living/simple_animal/hostile/proc/OpenFire(atom/A)
/mob/living/simple_animal/hostile/proc/CheckFriendlyFire(atom/A)
if(check_friendly_fire)
for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory
for(var/mob/living/L in T)
if(L == src || L == A)
continue
if(faction_check(L) && !attack_same)
return
if(faction_check_mob(L) && !attack_same)
return TRUE
/mob/living/simple_animal/hostile/proc/OpenFire(atom/A)
if(CheckFriendlyFire(A))
return
visible_message("<span class='danger'><b>[src]</b> [ranged_message] at [A]!</span>")
if(rapid)
@@ -37,6 +37,7 @@ Difficulty: Medium
ranged = 1
ranged_cooldown_time = 16
pixel_x = -16
crusher_loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
wander = FALSE
del_on_death = TRUE
@@ -48,7 +49,7 @@ Difficulty: Medium
var/guidance = FALSE
deathmessage = "falls to the ground, decaying into glowing particles."
death_sound = "bodyfall"
/obj/item/gps/internal/miner
icon_state = null
gpstag = "Resonant Signal"
@@ -42,6 +42,7 @@ Difficulty: Hard
ranged = 1
pixel_x = -32
del_on_death = 1
crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
var/charging = 0
medal_type = BOSS_MEDAL_BUBBLEGUM
@@ -45,7 +45,8 @@ Difficulty: Very Hard
del_on_death = 1
medal_type = BOSS_MEDAL_COLOSSUS
score_type = COLOSSUS_SCORE
loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/internal/vocal_cords/colossus)
crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
loot = list(/obj/structure/closet/crate/necropolis/colossus)
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
deathmessage = "disintegrates, leaving a glowing core in its wake."
death_sound = 'sound/misc/demon_dies.ogg'
@@ -43,6 +43,7 @@ Difficulty: Medium
move_to_delay = 10
ranged = 1
pixel_x = -16
crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
loot = list(/obj/structure/closet/crate/necropolis/dragon)
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
var/swooping = 0
@@ -271,6 +272,7 @@ Difficulty: Medium
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
loot = list()
crusher_loot = list()
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
return
@@ -53,6 +53,7 @@ Difficulty: Hard
ranged_cooldown_time = 40
aggro_vision_range = 23
loot = list(/obj/item/hierophant_staff)
crusher_loot = list(/obj/item/hierophant_staff, /obj/item/crusher_trophy/vortex_talisman)
wander = FALSE
var/burst_range = 3 //range on burst aoe
var/beam_range = 5 //range on cross blast beams
@@ -496,6 +497,7 @@ Difficulty: Hard
icon = 'icons/effects/effects.dmi'
icon_state = "hierophant_blast"
name = "vortex blast"
layer = 3.9 // between LYING_MOB_LAYER and ABOVE_MOB_LAYER
luminosity = 1
desc = "Get out of the way!"
duration = 9
@@ -555,6 +557,37 @@ Difficulty: Hard
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
M.take_damage(damage, BURN, 0, 0)
/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
name = "vortex wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
icon_state = "wall"
light_range = MINIMUM_USEFUL_LIGHT_RANGE
duration = 100
smooth = SMOOTH_TRUE
/obj/effect/temp_visual/hierophant/wall/New(loc, new_caster)
..()
queue_smooth_neighbors(src)
queue_smooth(src)
/obj/effect/temp_visual/hierophant/wall/Destroy()
queue_smooth_neighbors(src)
return ..()
/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target)
if(QDELETED(caster))
return FALSE
if(mover == caster.pulledby)
return TRUE
if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(P.firer == caster)
return TRUE
if(mover == caster)
return TRUE
return FALSE
/obj/effect/hierophant
name = "hierophant rune"
desc = "A powerful magic mark allowing whomever attunes themself to it to return to it at will."
@@ -31,6 +31,7 @@
/obj/structure/barricade,
/obj/machinery/field,
/obj/machinery/power/emitter)
var/list/crusher_loot
var/medal_type
var/score_type = BOSS_SCORE
var/elimination = 0
@@ -43,6 +44,10 @@
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
/mob/living/simple_animal/hostile/megafauna/New()
..()
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
/mob/living/simple_animal/hostile/megafauna/Destroy()
QDEL_NULL(internal_gps)
. = ..()
@@ -53,11 +58,17 @@
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
// this happens before the parent call because `del_on_death` may be set
if(can_die() && !admin_spawned)
feedback_set_details("megafauna_kills","[initial(name)]")
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
if(C && crusher_loot && C.total_damage >= maxHealth * 0.6)
spawn_crusher_loot()
if(!elimination) //used so the achievment only occurs for the last legion to die.
grant_achievement(medal_type,score_type)
feedback_set_details("megafauna_kills","[initial(name)]")
return ..()
/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
loot = crusher_loot
/mob/living/simple_animal/hostile/megafauna/AttackingTarget()
..()
if(isliving(target))

Some files were not shown because too many files have changed in this diff Show More