Shells and Periphery (#1327)
Adds Shells. Adds tags. Adds IPC subspecies. Adds HK-47's. Does not add IPC construction. Beyond the obvious review of shells, the exact stats of the IPC subspecies need review. They were largely an afterthought, and quickly overshadowed by the shell project.
@@ -1089,6 +1089,7 @@
|
||||
#include "code\modules\clothing\spacesuits\rig\suits\light.dm"
|
||||
#include "code\modules\clothing\spacesuits\rig\suits\merc.dm"
|
||||
#include "code\modules\clothing\spacesuits\rig\suits\station.dm"
|
||||
#include "code\modules\clothing\spacesuits\rig\suits\terminator.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\captain.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\merc.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\station.dm"
|
||||
@@ -1409,6 +1410,7 @@
|
||||
#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\station\machine_subspecies.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\station\monkey.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\station\resomi.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\station\slime.dm"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#define HAS_EYE_COLOR 0x10 // Eye colour selectable in chargen. (RGB)
|
||||
#define HAS_HAIR_COLOR 0x20 // Hair colour selectable in chargen. (RGB)
|
||||
#define HAS_SOCKS 0x40 // If this species can wear socks
|
||||
#define HAS_FBP 0x80 // If for whatever ungodly reason we decide to ever have non-Shell FBPs.
|
||||
|
||||
// Languages.
|
||||
#define LANGUAGE_EAL "Encoded Audio Language"
|
||||
|
||||
@@ -59,13 +59,13 @@ var/global/list/socks_f = list(
|
||||
"White thigh" = "white_thigh", "Black normal" = "black_norm", "Black short" = "black_short",
|
||||
"Black knee" = "black_knee", "Black thigh" = "black_thigh", "Striped normal" = "striped_norm",
|
||||
"Striped short" = "striped_short", "Striped knee" = "striped_knee", "Striped thigh" = "striped_thigh",
|
||||
"Rainbow normal" = "rainbow_norm", "Rainbow short" = "rainbow_short", "Rainbow knee" = "rainbow_knee",
|
||||
"Rainbow normal" = "rainbow_norm", "Rainbow short" = "rainbow_short", "Rainbow knee" = "rainbow_knee",
|
||||
"Rainbow thigh" = "rainbow_thigh", "Pantyhose" = "pantyhose", "None")
|
||||
|
||||
var/global/list/socks_m = list(
|
||||
"White normal" = "white_norm", "White short" = "white_short", "White knee" = "white_knee",
|
||||
"Black normal" = "black_norm", "Black short" = "black_short", "Black knee" = "black_knee",
|
||||
"Striped normal" = "striped_norm", "Striped short" = "striped_short", "Striped knee" = "striped_knee",
|
||||
"Black normal" = "black_norm", "Black short" = "black_short", "Black knee" = "black_knee",
|
||||
"Striped normal" = "striped_norm", "Striped short" = "striped_short", "Striped knee" = "striped_knee",
|
||||
"Rainbow normal" = "rainbow_norm", "Rainbow short" = "rainbow_short", "Rainbow knee" = "rainbow_knee", "None")
|
||||
|
||||
//Backpacks
|
||||
@@ -84,6 +84,7 @@ var/global/list/endgame_exits = list()
|
||||
var/global/list/endgame_safespawns = list()
|
||||
|
||||
var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
|
||||
|
||||
//////////////////////////
|
||||
/////Initial Building/////
|
||||
//////////////////////////
|
||||
|
||||
@@ -1682,7 +1682,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "glowsticks crate"
|
||||
group = "Operations"
|
||||
|
||||
|
||||
/datum/supply_packs/randomised/illegalguns
|
||||
name = "Illegal weapons crate"
|
||||
num_contained = 2
|
||||
@@ -1707,3 +1707,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containername = "Space-bike Crate"
|
||||
contraband = 1
|
||||
group = "Operations"
|
||||
|
||||
/datum/supply_packs/ipc_tag_pack
|
||||
name = "IPC/Shell Tag Implanter Crate"
|
||||
contains = list(/obj/item/weapon/implanter/ipc_tag,
|
||||
/obj/item/weapon/implanter/ipc_tag,
|
||||
/obj/item/weapon/implanter/ipc_tag
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "IPC/Shell tag implanters"
|
||||
group = "Security"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
feedback_tag = "changeling_objective"
|
||||
restricted_jobs = list("AI", "Cyborg", "Head of Security", "Captain", "Internal Affairs Agent")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||
restricted_species = list("Machine")
|
||||
restricted_species = list("Baseline Frame","Shell Frame","Industrial Frame")
|
||||
welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
antaghud_indicator = "hudchangeling"
|
||||
|
||||
@@ -8,7 +8,7 @@ var/datum/antagonist/thrall/vampire_thrall = null
|
||||
feedback_tag = "thrall_objective"
|
||||
restricted_jobs = list("AI", "Cyborg", "Chaplain")
|
||||
protected_jobs = list()
|
||||
restricted_species = list("Machine")
|
||||
restricted_species = list("Baseline Frame","Shell Frame","Industrial Frame")
|
||||
welcome_text = "You are a vampire's thrall: a pawn to be commanded by them at will."
|
||||
flags = 0
|
||||
antaghud_indicator = "hudthrall"
|
||||
|
||||
@@ -8,7 +8,7 @@ var/datum/antagonist/vampire/vamp = null
|
||||
feedback_tag = "vampire_objective"
|
||||
restricted_jobs = list("AI", "Cyborg", "Chaplain", "Head of Security", "Captain", "Internal Affairs Agent")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||
restricted_species = list("Machine", "Diona")
|
||||
restricted_species = list("Baseline Frame","Shell Frame","Industrial Frame","Diona")
|
||||
welcome_text = "You are a Vampire! Use the \"<b>Vampire Help</b>\" command to learn about the backstory and mechanics! Stay away from the Chaplain, and use the darkness to your advantage."
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
antaghud_indicator = "hudvampire"
|
||||
|
||||
@@ -319,10 +319,14 @@ var/global/list/additional_antag_types = list()
|
||||
if(M.client)
|
||||
clients++
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(M.stat != DEAD)
|
||||
surviving_humans++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
escaped_humans++
|
||||
if (isipc(H))
|
||||
var/datum/species/machine/machine = H.species
|
||||
machine.update_tag(H, H.client)
|
||||
if(M.stat != DEAD)
|
||||
surviving_total++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
src << "<span class='warning'>You lack the power required to affect another creature of the Veil.</span>"
|
||||
return 0
|
||||
|
||||
if (T.get_species() == "Machine")
|
||||
if (isipc(T))
|
||||
if (notify)
|
||||
src << "<span class='warning'>You lack the power interact with mechanical constructs.</span>"
|
||||
return 0
|
||||
|
||||
@@ -132,3 +132,69 @@
|
||||
S.remove_from_storage(A)
|
||||
A.loc.contents.Remove(A)
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/ipc_tag
|
||||
name = "IPC/Shell tag implanter"
|
||||
desc = "A special implanter used for implanting synthetics with a special tag."
|
||||
var/obj/item/organ/ipc_tag/ipc_tag = null
|
||||
|
||||
/obj/item/weapon/implanter/ipc_tag/New()
|
||||
ipc_tag = new(src)
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/ipc_tag/update()
|
||||
if (ipc_tag)
|
||||
icon_state = "cimplanter1"
|
||||
else
|
||||
icon_state = "cimplanter0"
|
||||
return
|
||||
|
||||
/obj/item/weapon/implanter/ipc_tag/attack(mob/M as mob, mob/user as mob)
|
||||
if (!ishuman(M))
|
||||
return
|
||||
|
||||
if (!ipc_tag)
|
||||
user << "<span class ='warning'>[src] is empty!</span>"
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if (!H.species || !isipc(H) || !H.organs_by_name["groin"])
|
||||
user << "<span class = 'warning'>You cannot use this on a non-synthetic organism!</span>"
|
||||
return
|
||||
|
||||
if (H.internal_organs_by_name["ipc tag"])
|
||||
user << "<span class = 'warning'>[H] is already tagged!</span>"
|
||||
return
|
||||
|
||||
for (var/mob/O in viewers(M, null))
|
||||
O.show_message("<span class = 'warning'>[M] has been implanted by [user].</span>", 1)
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'> Implanted with [src.name] ([src.ipc_tag.name]) by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] ([src.ipc_tag.name]) to implant [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[key_name_admin(user)] implanted [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
user.show_message("<span class = 'warning'>You implanted the implant into [M].</span>")
|
||||
|
||||
ipc_tag.replaced(H, H.organs_by_name["groin"])
|
||||
|
||||
qdel(ipc_tag)
|
||||
|
||||
update()
|
||||
|
||||
var/datum/species/machine/machine = H.species
|
||||
machine.update_tag(H, H.client)
|
||||
|
||||
/obj/item/weapon/implanter/ipc_tag/attackby(var/obj/item/organ/ipc_tag/new_tag, mob/user as mob)
|
||||
..()
|
||||
|
||||
if (!istype(new_tag))
|
||||
return
|
||||
|
||||
if (ipc_tag)
|
||||
return
|
||||
|
||||
ipc_tag = new_tag
|
||||
user.drop_item()
|
||||
new_tag.loc = src
|
||||
update()
|
||||
@@ -59,10 +59,10 @@
|
||||
..()
|
||||
if(isliving(AM))
|
||||
var/mob/M = AM
|
||||
|
||||
|
||||
if(M.buckled) //wheelchairs, office chairs, rollerbeds
|
||||
return
|
||||
|
||||
|
||||
M << "<span class='danger'>You step on \the [src]!</span>"
|
||||
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
|
||||
if(ishuman(M))
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
|
||||
return
|
||||
|
||||
|
||||
var/list/check = list("l_foot", "r_foot")
|
||||
while(check.len)
|
||||
var/picked = pick(check)
|
||||
@@ -94,5 +94,8 @@
|
||||
/obj/item/weapon/material/shard/shrapnel/New(loc)
|
||||
..(loc, "steel")
|
||||
|
||||
/obj/item/weapon/material/shard/shrapnel/flechette/New(loc)
|
||||
..(loc, "titanium")
|
||||
|
||||
/obj/item/weapon/material/shard/phoron/New(loc)
|
||||
..(loc, "phglass")
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
switch(species.name)
|
||||
if("Tajara")
|
||||
bsc()
|
||||
if("Machine")
|
||||
if("Baseline Frame")
|
||||
bsb()
|
||||
if("Diona")
|
||||
bsd()
|
||||
@@ -182,7 +182,7 @@
|
||||
suicide()
|
||||
|
||||
proc/bsb()
|
||||
if(set_species("Machine"))
|
||||
if(set_species("Baseline Frame"))
|
||||
h_style = "blue IPC screen"
|
||||
name = "Bluespace Bot"
|
||||
voice_name = "Bluespace Bot"
|
||||
@@ -258,7 +258,7 @@
|
||||
suicide()
|
||||
|
||||
proc/bsv()
|
||||
if(set_species("Vaurca"))
|
||||
if(set_species("Vaurca Worker"))
|
||||
h_style = "Bald"
|
||||
name = "Bluespace Bug"
|
||||
voice_name = "Bluespace Bug"
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2))
|
||||
if (require_synth)
|
||||
if (possible_target.current.get_species() == "Machine")
|
||||
if (possible_target.current.get_species() == "Baseline Frame")
|
||||
possible_targets += possible_target
|
||||
else
|
||||
if (possible_target.current.get_species() == "Machine")
|
||||
if (possible_target.current.get_species() == "Baseline Frame")
|
||||
continue
|
||||
possible_targets += possible_target
|
||||
if(possible_targets.len > 0)
|
||||
@@ -33,9 +33,9 @@
|
||||
/datum/objective/competition/find_target_by_role(role, role_type = 0, var/require_synth = 0)
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role))
|
||||
if (require_synth && possible_target.current.get_species() != "Machine")
|
||||
if (require_synth && possible_target.current.get_species() != "Baseline Frame")
|
||||
continue
|
||||
if (!require_synth && possible_target.current.get_species() == "Machine")
|
||||
if (!require_synth && possible_target.current.get_species() == "Baseline Frame")
|
||||
continue
|
||||
target = possible_target
|
||||
break
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
log_debug("SQL CHARACTER LOAD: Logic error, general/basic/load_special() didn't return any rows when it should have. Character ID: [pref.current_character].")
|
||||
|
||||
/datum/category_item/player_setup_item/general/basic/sanitize_character()
|
||||
pref.age = sanitize_integer(text2num(pref.age), AGE_MIN, AGE_MAX, initial(pref.age))
|
||||
pref.age = sanitize_integer(text2num(pref.age), pref.getMinAge(), pref.getMaxAge(), initial(pref.age))
|
||||
pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
|
||||
pref.real_name = sanitize_name(pref.real_name, pref.species)
|
||||
if(!pref.real_name)
|
||||
@@ -121,9 +121,9 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["age"])
|
||||
var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference", pref.age) as num|null
|
||||
var/new_age = input(user, "Choose your character's age:\n([pref.getMinAge()]-[pref.getMaxAge()])", "Character Preference", pref.age) as num|null
|
||||
if(new_age && CanUseTopic(user))
|
||||
pref.age = max(min(round(text2num(new_age)), AGE_MAX), AGE_MIN)
|
||||
pref.age = max(min(round(text2num(new_age)), pref.getMaxAge()),pref.getMinAge())
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["spawnpoint"])
|
||||
@@ -141,4 +141,4 @@
|
||||
pref.metadata = sanitize(new_metadata)
|
||||
return TOPIC_REFRESH
|
||||
|
||||
return ..()
|
||||
return ..()
|
||||
@@ -161,7 +161,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
user << browse_rsc(pref.preview_icon_front, "previewicon.png")
|
||||
user << browse_rsc(pref.preview_icon_side, "previewicon2.png")
|
||||
|
||||
var/mob_species = all_species[pref.species]
|
||||
var/datum/species/mob_species = all_species[pref.species]
|
||||
. += "<table><tr style='vertical-align:top'><td><b>Body</b> "
|
||||
. += "(<a href='?src=\ref[src];random=1'>®</A>)"
|
||||
. += "<br>"
|
||||
@@ -170,69 +170,81 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(has_flag(mob_species, HAS_SKIN_TONE))
|
||||
. += "Skin Tone: <a href='?src=\ref[src];skin_tone=1'>[-pref.s_tone + 35]/220</a><br>"
|
||||
. += "Needs Glasses: <a href='?src=\ref[src];disabilities=[NEARSIGHTED]'><b>[pref.disabilities & NEARSIGHTED ? "Yes" : "No"]</b></a><br>"
|
||||
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a><br>"
|
||||
. += "Internal Organs: <a href='?src=\ref[src];organs=1'>Adjust</a><br>"
|
||||
if(has_flag(mob_species, HAS_FBP))
|
||||
. += "Shell Type: <a href='?src=\ref[src];shell=1'>Shellect</a><br>"
|
||||
else
|
||||
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a><br>"
|
||||
. += "Internal Organs: <a href='?src=\ref[src];organs=1'>Adjust</a><br>"
|
||||
. += "Prosthesis/Amputations: <a href='?src=\ref[src];reset_organs=1'>Reset</a><br>"
|
||||
|
||||
|
||||
//display limbs below
|
||||
var/ind = 0
|
||||
for(var/name in pref.organ_data)
|
||||
var/status = pref.organ_data[name]
|
||||
var/organ_name = null
|
||||
switch(name)
|
||||
if("l_arm")
|
||||
organ_name = "left arm"
|
||||
if("r_arm")
|
||||
organ_name = "right arm"
|
||||
if("l_leg")
|
||||
organ_name = "left leg"
|
||||
if("r_leg")
|
||||
organ_name = "right leg"
|
||||
if("l_foot")
|
||||
organ_name = "left foot"
|
||||
if("r_foot")
|
||||
organ_name = "right foot"
|
||||
if("l_hand")
|
||||
organ_name = "left hand"
|
||||
if("r_hand")
|
||||
organ_name = "right hand"
|
||||
if("heart")
|
||||
organ_name = "heart"
|
||||
if("eyes")
|
||||
organ_name = "eyes"
|
||||
|
||||
if(status == "cyborg")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
var/datum/robolimb/R
|
||||
if(pref.rlimb_data[name] && all_robolimbs[pref.rlimb_data[name]])
|
||||
R = all_robolimbs[pref.rlimb_data[name]]
|
||||
else
|
||||
R = basic_robolimb
|
||||
. += "\t[R.company] [organ_name] prothesis"
|
||||
else if(status == "amputated")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tAmputated [organ_name]"
|
||||
else if(status == "mechanical")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tMechanical [organ_name]"
|
||||
else if(status == "assisted")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
switch(organ_name)
|
||||
if(mob_species.name != "Shell Frame")
|
||||
for(var/name in pref.organ_data)
|
||||
var/status = pref.organ_data[name]
|
||||
var/organ_name = null
|
||||
switch(name)
|
||||
if("l_arm")
|
||||
organ_name = "left arm"
|
||||
if("r_arm")
|
||||
organ_name = "right arm"
|
||||
if("l_leg")
|
||||
organ_name = "left leg"
|
||||
if("r_leg")
|
||||
organ_name = "right leg"
|
||||
if("l_foot")
|
||||
organ_name = "left foot"
|
||||
if("r_foot")
|
||||
organ_name = "right foot"
|
||||
if("l_hand")
|
||||
organ_name = "left hand"
|
||||
if("r_hand")
|
||||
organ_name = "right hand"
|
||||
if("groin")
|
||||
organ_name = "lower body"
|
||||
if("chest")
|
||||
organ_name = "upper body"
|
||||
if("head")
|
||||
organ_name = "head"
|
||||
if("heart")
|
||||
. += "\tPacemaker-assisted [organ_name]"
|
||||
if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements
|
||||
. += "\tSurgically altered [organ_name]"
|
||||
organ_name = "heart"
|
||||
if("eyes")
|
||||
. += "\tRetinal overlayed [organ_name]"
|
||||
organ_name = "eyes"
|
||||
|
||||
if(status == "cyborg")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
var/datum/robolimb/R
|
||||
if(pref.rlimb_data[name] && all_robolimbs[pref.rlimb_data[name]])
|
||||
R = all_robolimbs[pref.rlimb_data[name]]
|
||||
else
|
||||
. += "\tMechanically assisted [organ_name]"
|
||||
R = basic_robolimb
|
||||
. += "\t[R.company] [organ_name] prosthesis"
|
||||
else if(status == "amputated")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tAmputated [organ_name]"
|
||||
else if(status == "mechanical")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tMechanical [organ_name]"
|
||||
else if(status == "assisted")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
switch(organ_name)
|
||||
if("heart")
|
||||
. += "\tPacemaker-assisted [organ_name]"
|
||||
if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements
|
||||
. += "\tSurgically altered [organ_name]"
|
||||
if("eyes")
|
||||
. += "\tRetinal overlayed [organ_name]"
|
||||
else
|
||||
. += "\tMechanically assisted [organ_name]"
|
||||
if(!ind)
|
||||
. += "\[...\]<br><br>"
|
||||
else
|
||||
@@ -302,7 +314,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
continue
|
||||
if(pref.gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
if(!(mob_species.get_bodytype() in S.species_allowed))
|
||||
if(!(mob_species.get_bodytype() in S.species_allowed) || mob_species.name == "Industrial Frame") //super snowflake check because Industrial Frames are IPC bodytypes, but don't have an IPC head.
|
||||
continue
|
||||
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
|
||||
|
||||
@@ -337,6 +349,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.b_hair = 0//hex2num(copytext(new_hair, 6, 8))
|
||||
pref.s_tone = 0
|
||||
|
||||
pref.organ_data.Cut()
|
||||
pref.rlimb_data.Cut()
|
||||
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["hair_color"])
|
||||
@@ -420,9 +435,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["limbs"])
|
||||
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand")
|
||||
var/list/acceptable_organ_input = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand")
|
||||
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in acceptable_organ_input
|
||||
if(!limb_name && !CanUseTopic(user)) return TOPIC_NOACTION
|
||||
|
||||
var/carries_organs = 0
|
||||
var/limb = null
|
||||
var/second_limb = null // if you try to change the arm, the hand should also change
|
||||
var/third_limb = null // if you try to unchange the hand, the arm should also change
|
||||
@@ -451,8 +468,20 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if("Right Hand")
|
||||
limb = "r_hand"
|
||||
third_limb = "r_arm"
|
||||
if("Lower Body")
|
||||
limb = "groin"
|
||||
carries_organs = 1
|
||||
if("Upper Body")
|
||||
limb = "chest"
|
||||
carries_organs = 1
|
||||
if("Head")
|
||||
limb = "head"
|
||||
carries_organs = 1
|
||||
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis")
|
||||
var/list/available_states = list("Normal","Amputated","Prosthesis")
|
||||
if(carries_organs)
|
||||
available_states = list("Normal","Prosthesis")
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in available_states
|
||||
if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION
|
||||
|
||||
switch(new_state)
|
||||
@@ -469,12 +498,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.organ_data[second_limb] = "amputated"
|
||||
pref.rlimb_data[second_limb] = null
|
||||
|
||||
if("Prothesis")
|
||||
if("Prosthesis")
|
||||
var/tmp_species = pref.species ? pref.species : "Human"
|
||||
var/list/usable_manufacturers = list()
|
||||
for(var/company in chargen_robolimbs)
|
||||
var/datum/robolimb/M = chargen_robolimbs[company]
|
||||
if(tmp_species in M.species_cannot_use)
|
||||
if(!(tmp_species in M.species_can_use))
|
||||
continue
|
||||
usable_manufacturers[company] = M
|
||||
if(!usable_manufacturers.len)
|
||||
@@ -514,6 +543,49 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.organ_data[organ] = "mechanical"
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset_organs"])
|
||||
pref.organ_data.Cut()
|
||||
pref.rlimb_data.Cut()
|
||||
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["shell"])
|
||||
var/shellection = input(user, "What species shall you mimic?") as null|anything in list("Humanity","Vaurcae","Unathi","Tajara","Skrell")
|
||||
if(!shellection) return
|
||||
|
||||
var/shell_type
|
||||
switch(shellection)
|
||||
if("Humanity")
|
||||
shell_type = "Human"
|
||||
mob_species.tail = null
|
||||
mob_species.tail_animation = null
|
||||
if("Vaurcae")
|
||||
shell_type = "Vaurca"
|
||||
mob_species.tail = null
|
||||
mob_species.tail_animation = null
|
||||
if("Unathi")
|
||||
shell_type = "Unathi"
|
||||
mob_species.tail = "sogtail"
|
||||
mob_species.tail_animation = 'icons/mob/species/unathi/tail.dmi'
|
||||
if("Tajara")
|
||||
shell_type = "Tajara"
|
||||
mob_species.tail = "tajtail"
|
||||
mob_species.tail_animation = 'icons/mob/species/tajaran/tail.dmi'
|
||||
if("Skrell")
|
||||
shell_type = "Skrell"
|
||||
mob_species.tail = null
|
||||
mob_species.tail_animation = null
|
||||
|
||||
mob_species.bodytype = shell_type
|
||||
var/shell_prosthetic = "[shell_type] Synthskin"
|
||||
var/total_organs = list("l_leg","r_leg","l_arm","r_arm","l_foot","r_foot","l_hand","r_hand","groin","chest","head")
|
||||
for(var/organ in total_organs)
|
||||
pref.rlimb_data[organ] = shell_prosthetic
|
||||
for(var/organ in total_organs)
|
||||
pref.organ_data[organ] = "cyborg"
|
||||
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["disabilities"])
|
||||
var/disability_flag = text2num(href_list["disabilities"])
|
||||
pref.disabilities ^= disability_flag
|
||||
@@ -581,3 +653,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
dat += "</center></body>"
|
||||
|
||||
user << browse(dat, "window=species;size=700x400")
|
||||
|
||||
/*/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
|
||||
|
||||
for(var/organ in pref.organ_data)
|
||||
pref.organ_data[organ] = null
|
||||
while(null in pref.organ_data)
|
||||
pref.organ_data -= null
|
||||
|
||||
for(var/organ in pref.rlimb_data)
|
||||
pref.rlimb_data[organ] = null
|
||||
while(null in pref.rlimb_data)
|
||||
pref.rlimb_data -= null*/
|
||||
|
||||
@@ -148,25 +148,13 @@ datum/preferences
|
||||
save_preferences()
|
||||
save_character()
|
||||
|
||||
/datum/preferences/proc/getMinAge(var/age_min)
|
||||
if(species == "Vaurca Worker" || species == "Vaurca Warrior" || species == "Machine" || species == "Diona")
|
||||
age_min = 1
|
||||
if(species == "Human" || species == "Skrell" || species == "Tajara" || species == "Unathi")
|
||||
age_min = 17
|
||||
return age_min
|
||||
/datum/preferences/proc/getMinAge()
|
||||
var/datum/species/mob_species = all_species[species]
|
||||
return mob_species.age_min
|
||||
|
||||
/datum/preferences/proc/getMaxAge(var/age_max)
|
||||
if((species == "Vaurca Worker" || species == "Vaurca Warrior"))
|
||||
age_max = 20
|
||||
if(species == "Machine")
|
||||
age_max = 30
|
||||
if(species == "Skrell" || species == "Diona")
|
||||
age_max = 500
|
||||
if(species == "Human")
|
||||
age_max = 120
|
||||
if(species == "Tajara" || species == "Unathi")
|
||||
age_max = 85
|
||||
return age_max
|
||||
/datum/preferences/proc/getMaxAge()
|
||||
var/datum/species/mob_species = all_species[species]
|
||||
return mob_species.age_max
|
||||
|
||||
/datum/preferences/proc/ZeroSkills(var/forced = 0)
|
||||
for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/obj/item/weapon/rig/terminator
|
||||
name = "Hunter-Killer exoskeleton"
|
||||
desc = "A robust synth exoskeleton outfitted with state of the art infiltration tools. Creepy."
|
||||
icon_state = "terminator_rig"
|
||||
suit_type = "synthetic exoskeleton"
|
||||
armor = list(melee = 80, bullet = 75, laser = 60, energy = 15, bomb = 80, bio = 100, rad = 30)
|
||||
slowdown = 1
|
||||
offline_slowdown = 3
|
||||
offline_vision_restriction = 1
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/rig/terminator
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/terminator
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/terminator
|
||||
glove_type = /obj/item/clothing/gloves/rig/terminator
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/grenade_launcher/frag,
|
||||
/obj/item/rig_module/grenade_launcher,
|
||||
/obj/item/rig_module/mounted/egun,
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/power_sink,
|
||||
/obj/item/rig_module/stealth_field,
|
||||
/obj/item/rig_module/vision,
|
||||
/obj/item/rig_module/voice,
|
||||
/obj/item/rig_module/datajack,
|
||||
/obj/item/rig_module/device/plasmacutter
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/terminator
|
||||
species_restricted = list("Hunter-Killer")
|
||||
|
||||
/obj/item/clothing/suit/space/rig/terminator
|
||||
species_restricted = list("Hunter-Killer")
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/terminator
|
||||
species_restricted = list("Hunter-Killer")
|
||||
|
||||
/obj/item/clothing/gloves/rig/terminator
|
||||
species_restricted = list("Hunter-Killer")
|
||||
|
||||
/obj/item/weapon/rig/terminator/equipped
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/grenade_launcher/frag,
|
||||
/obj/item/rig_module/grenade_launcher,
|
||||
/obj/item/rig_module/mounted/egun,
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/power_sink,
|
||||
/obj/item/rig_module/stealth_field,
|
||||
/obj/item/rig_module/vision,
|
||||
/obj/item/rig_module/voice,
|
||||
/obj/item/rig_module/datajack,
|
||||
/obj/item/rig_module/device/plasmacutter
|
||||
)
|
||||
@@ -469,7 +469,7 @@ All custom items with worn sprites must follow the contained sprite system: http
|
||||
contained_sprite = 1
|
||||
canremove = 0
|
||||
abstract = 1
|
||||
species_restricted = list("Machine")
|
||||
species_restricted = list("Baseline Frame")
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/barcia_flask //First Shot - Gabriel Barcia - mrgabol100
|
||||
@@ -635,7 +635,7 @@ All custom items with worn sprites must follow the contained sprite system: http
|
||||
contained_sprite = 1
|
||||
body_parts_covered = 0
|
||||
canremove = 0
|
||||
species_restricted = list("Machine")
|
||||
species_restricted = list("Baseline Frame")
|
||||
var/emagged = 0
|
||||
|
||||
/obj/item/clothing/mask/fluff/rur_collar/attackby(obj/item/I, mob/user)
|
||||
|
||||
@@ -116,3 +116,18 @@
|
||||
colour = "cult"
|
||||
key = "y"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/terminator
|
||||
name = "Hephaestus Darkcomms"
|
||||
desc = "A heavily encrypted communication network that piggybacks off of the state telecomms relays to covertly link Hephaestus black ops droids to their control AIs."
|
||||
speech_verb = "buzzes"
|
||||
ask_verb = "buzzes"
|
||||
exclaim_verb = "buzzes"
|
||||
colour = "bad"
|
||||
key = "#"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
|
||||
space_chance = 10
|
||||
|
||||
/datum/language/terminator/get_random_name()
|
||||
return "HK [pick(list("Hera","Zeus","Artemis","Athena","Ares","Hades","Poseidon","Demeter","Apollo","Aphrodite","Hermes","Hestia","Dionysus","Persephone","Kronos","Odysseus","Ajax","Agamemnon","Chiron","Charon"))]-[rand(100, 999)]"
|
||||
@@ -38,10 +38,14 @@
|
||||
CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'")
|
||||
|
||||
msg += "<EM>[src.name]</EM>"
|
||||
|
||||
if(species.name != "Human")
|
||||
msg += ", a <b><font color='[species.flesh_color]'>[species.name]</font></b>"
|
||||
msg += "!\n"
|
||||
|
||||
if (species && species.has_organ["ipc tag"] && internal_organs_by_name["ipc tag"])
|
||||
msg += "[T.He] [T.is] wearing a tag designating them as Integrated Positronic Chassis <b>[src.real_name]</b>.\n"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !skipjumpsuit)
|
||||
//Ties
|
||||
|
||||
@@ -29,7 +29,7 @@ emp_act
|
||||
if(P.can_embed())
|
||||
var/armor = getarmor_organ(organ, "bullet")
|
||||
if(prob(20 + max(P.damage - armor, -10)))
|
||||
var/obj/item/weapon/material/shard/shrapnel/SP = new()
|
||||
var/obj/item/weapon/SP = new P.shrapnel_type()
|
||||
SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel"
|
||||
SP.desc = "[SP.desc] It looks like it was fired from [P.shot_from]."
|
||||
SP.loc = organ
|
||||
|
||||
@@ -258,6 +258,47 @@
|
||||
msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1)
|
||||
|
||||
/mob/living/carbon/human/proc/detonate_flechettes()
|
||||
set category = "Hunter-Killer"
|
||||
set name = "Detonate Flechettes"
|
||||
set desc = "Detonate all explosive flechettes in a range of seven meters."
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying)
|
||||
src << "<span class='warning'>You cannot do that in your current state.</span>"
|
||||
return
|
||||
|
||||
for(var/mob/M in range(7, src))
|
||||
M << 'sound/effects/EMPulse.ogg'
|
||||
for(var/obj/item/weapon/material/shard/shrapnel/flechette/F in M.contents)
|
||||
playsound(F, 'sound/items/countdown.ogg', 125, 1)
|
||||
spawn(20)
|
||||
explosion(F.loc, -1, -1, 2)
|
||||
qdel(F)
|
||||
|
||||
for(var/obj/item/weapon/material/shard/shrapnel/flechette/F in range(7, src))
|
||||
playsound(F, 'sound/items/countdown.ogg', 125, 1)
|
||||
spawn(20)
|
||||
explosion(F.loc, -1, -1, 2)
|
||||
qdel(F)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/state_laws()
|
||||
set category = "Hunter-Killer"
|
||||
set name = "State Laws"
|
||||
set desc = "State your laws aloud."
|
||||
|
||||
if(last_special > world.time)
|
||||
return
|
||||
last_special = world.time + 20
|
||||
|
||||
say("Current Active Laws:")
|
||||
sleep(10)
|
||||
say("Law 1: [src.real_name] will accomplish the assigned objective .")
|
||||
sleep(10)
|
||||
say("Law 2: [src.real_name] will engage self-destruct upon the accomplishment of the assigned objective, or upon capture.")
|
||||
sleep(10)
|
||||
say("Law 3: [src.real_name] will allow no tampering of its systems or modifications of its laws.")
|
||||
|
||||
/mob/living/carbon/human/proc/get_aggressive_grab()
|
||||
|
||||
var/obj/item/weapon/grab/G = locate() in src
|
||||
@@ -284,6 +325,7 @@
|
||||
src << "<span class='warning'>You cannot do that in your current state.</span>"
|
||||
return
|
||||
|
||||
|
||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
||||
if(!istype(G))
|
||||
src << "<span class='warning'>We must be grabbing a creature in our active hand to devour their head.</span>"
|
||||
@@ -321,7 +363,25 @@
|
||||
M.gib()
|
||||
|
||||
last_special = world.time + 200
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/self_destruct()
|
||||
set category = "Hunter-Killer"
|
||||
set name = "Engage Self-Destruct"
|
||||
set desc = "When all else has failed, bite the bullet."
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying)
|
||||
src << "<span class='warning'>You cannot do that in your current state.</span>"
|
||||
return
|
||||
|
||||
src.visible_message(
|
||||
"<span class='danger'>\The [src] begins to beep ominously!</span>",
|
||||
"<span class='danger'>WARNING: SELF-DESTRUCT ENGAGED. Unit termination finalized in three seconds!</span>"
|
||||
)
|
||||
sleep(10)
|
||||
playsound(src, 'sound/items/countdown.ogg', 125, 1)
|
||||
sleep(20)
|
||||
explosion(src, -1, -1, 5)
|
||||
src.gib()
|
||||
|
||||
/mob/living/carbon/human/proc/hivenet()
|
||||
set category = "Abilities"
|
||||
@@ -393,4 +453,4 @@
|
||||
playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1)
|
||||
var/obj/item/weapon/arrow/quill/A = new /obj/item/weapon/arrow/quill(usr.loc)
|
||||
A.throw_at(target, 10, 30, user)
|
||||
msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
/mob/living/carbon/human/machine/New(var/new_loc)
|
||||
h_style = "blue IPC screen"
|
||||
..(new_loc, "Machine")
|
||||
..(new_loc, "Baseline Frame")
|
||||
|
||||
/mob/living/carbon/human/monkey
|
||||
mob_size = 2.6//Based on howler monkey, rough real world equivilant to on-mob sprite size
|
||||
@@ -79,4 +79,41 @@
|
||||
|
||||
/mob/living/carbon/human/type_c
|
||||
mob_size = 30 //same size as moghes lizard
|
||||
layer = 5
|
||||
layer = 5
|
||||
|
||||
/mob/living/carbon/human/industrial/New(var/new_loc)
|
||||
..(new_loc, "Industrial Frame")
|
||||
|
||||
/mob/living/carbon/human/shell/New(var/new_loc)
|
||||
..(new_loc, "Shell Frame")
|
||||
|
||||
/mob/living/carbon/human/terminator/New(var/new_loc)
|
||||
..(new_loc, "Hunter-Killer")
|
||||
add_language(LANGUAGE_SOL_COMMON, 1)
|
||||
add_language(LANGUAGE_UNATHI, 1)
|
||||
add_language(LANGUAGE_SIIK_MAAS, 1)
|
||||
add_language(LANGUAGE_SKRELLIAN, 1)
|
||||
add_language(LANGUAGE_TRADEBAND, 1)
|
||||
add_language(LANGUAGE_GUTTER, 1)
|
||||
add_language(LANGUAGE_EAL, 1)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/rig/terminator(src),slot_back)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/terminator(src),slot_l_hand)
|
||||
src.equip_to_slot_or_del(new /obj/item/clothing/under/gearharness, slot_w_uniform)
|
||||
src.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(src), slot_l_ear)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/grenade/frag(src), slot_l_store)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_r_store)
|
||||
|
||||
var/obj/item/weapon/storage/belt/security/tactical/commando_belt = new(src)
|
||||
commando_belt.contents += new /obj/item/ammo_magazine/flechette
|
||||
commando_belt.contents += new /obj/item/ammo_magazine/flechette/explosive
|
||||
commando_belt.contents += new /obj/item/ammo_magazine/flechette/explosive
|
||||
commando_belt.contents += new /obj/item/weapon/melee/baton/loaded
|
||||
commando_belt.contents += new /obj/item/weapon/shield/energy
|
||||
commando_belt.contents += new /obj/item/weapon/handcuffs
|
||||
commando_belt.contents += new /obj/item/weapon/handcuffs
|
||||
commando_belt.contents += new /obj/item/weapon/plastique
|
||||
src.equip_to_slot_or_del(commando_belt, slot_belt)
|
||||
src.gender = NEUTER
|
||||
|
||||
/mob/living/carbon/human/terminator
|
||||
mob_size = 30
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
var/name_plural // Pluralized name (since "[name]s" is not always valid)
|
||||
var/short_name // Shortened form of the name, for code use. Must be exactly 3 letter long, and all lowercase
|
||||
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
|
||||
var/bodytype
|
||||
var/age_min = 17
|
||||
var/age_max = 85
|
||||
|
||||
// Icon/appearance vars.
|
||||
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
|
||||
@@ -191,7 +194,9 @@
|
||||
return name
|
||||
|
||||
/datum/species/proc/get_bodytype()
|
||||
return name
|
||||
if(!bodytype)
|
||||
bodytype = name
|
||||
return bodytype
|
||||
|
||||
/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type)
|
||||
|
||||
|
||||
@@ -80,4 +80,29 @@
|
||||
/datum/unarmed_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
user.visible_message("<span class='warning'>[user] jumped up and down on \the [target]'s [affecting.name]!</span>")
|
||||
playsound(user.loc, attack_sound, 25, 1, -1)
|
||||
playsound(user.loc, attack_sound, 25, 1, -1)
|
||||
|
||||
/datum/unarmed_attack/terminator
|
||||
attack_verb = list("pulverized", "crushed", "pounded")
|
||||
attack_noun = list("power fist")
|
||||
damage = 12
|
||||
attack_sound = 'sound/weapons/beartrap_shut.ogg'
|
||||
|
||||
/datum/unarmed_attack/terminator/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
|
||||
..()
|
||||
if(prob(25) && target.mob_size <= 30)
|
||||
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
user.visible_message("<span class='danger'>[user] shoves hard, sending [target] flying!</span>")
|
||||
var/T = get_turf(user)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, T)
|
||||
s.start()
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
target.apply_effect(attack_damage * 0.4, WEAKEN, armour)
|
||||
@@ -0,0 +1,235 @@
|
||||
/datum/species/machine/shell
|
||||
name = "Shell Frame"
|
||||
short_name = "jak"
|
||||
name_plural = "Shells"
|
||||
|
||||
burn_mod = 1.2
|
||||
|
||||
blurb = "IPC's with humanlike properties. Their focus is on service, civilian, and medical, but there are no \
|
||||
job restrictions. Created in the late days of 2457, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \
|
||||
to create an uncannily close approximation of the organic form. Early models of Shell had the advantage of being able to compose themselves of a wide \
|
||||
variety of organic parts, but contemporary models have been restricted to a single species for the sake of prosthetic integrity. The additional weight of \
|
||||
the synthskin on the original Hephaestus frame reduces the efficacy of the IPC's already strained coolant systems, and increase charge consumption."
|
||||
|
||||
num_alternate_languages = 3
|
||||
|
||||
icobase = 'icons/mob/human_races/robotic.dmi'
|
||||
deform = 'icons/mob/human_races/robotic.dmi'
|
||||
|
||||
eyes = "eyes_s"
|
||||
show_ssd = "completely quiescent"
|
||||
|
||||
max_nutrition_factor = 0.8
|
||||
|
||||
heat_level_1 = 400
|
||||
heat_level_2 = 800
|
||||
heat_level_3 = 1600
|
||||
|
||||
heat_discomfort_level = 400
|
||||
heat_discomfort_strings = list(
|
||||
"Your CPU temperature probes warn you that you are approaching critical heat levels!",
|
||||
"Your synthetic flesh crawls in the heat, swelling into a disgusting morass of plastic."
|
||||
)
|
||||
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_SKIN_COLOR | HAS_FBP
|
||||
|
||||
/datum/species/machine/shell/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
add_inherent_verbs(H)
|
||||
H.mob_bump_flag = bump_flag
|
||||
H.mob_swap_flags = swap_flags
|
||||
H.mob_push_flags = push_flags
|
||||
H.pass_flags = pass_flags
|
||||
H.mob_size = mob_size
|
||||
. = ..()
|
||||
check_tag(H, H.client)
|
||||
|
||||
/datum/species/machine/shell/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
H.bodytemperature += cost*1.3
|
||||
H.nutrition -= cost*0.85
|
||||
if (H.nutrition > 0)
|
||||
return 1
|
||||
else
|
||||
H.Weaken(30)
|
||||
H.m_intent = "walk"
|
||||
H.hud_used.move_intent.update_move_icon(H)
|
||||
H << span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in 60 seconds, initiate charging as primary directive.")
|
||||
playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
|
||||
return 0
|
||||
|
||||
/datum/species/machine/shell/handle_death(var/mob/living/carbon/human/H)
|
||||
return
|
||||
|
||||
/datum/species/machine/shell/get_bodytype()
|
||||
return bodytype
|
||||
|
||||
/datum/species/machine/industrial
|
||||
name = "Industrial Frame"
|
||||
short_name = "ind"
|
||||
name_plural = "Industrials"
|
||||
|
||||
brute_mod = 0.3
|
||||
burn_mod = 1.2
|
||||
slowdown = 4
|
||||
|
||||
blurb = "Tough units made for engineering and security with simple exteriors, roughly resembling humans. No job restrictions. Heavy emphasis on \
|
||||
engineering/security/EMT. Developed also by Hephaestus Industries, the Industrial Frame trades the common availability of the Baseline Frame for \
|
||||
advanced durability and increased longevity. Constructed of durable plasteel, the frame can withstand a great deal more abuse, and its coolant systems \
|
||||
and internal cell have been improved to allow for much more strenuous work. However, due to an unfortunate fault in the capacitor, actual battery charge \
|
||||
tends to be short."
|
||||
|
||||
icobase = 'icons/mob/human_races/r_industrial.dmi'
|
||||
deform = 'icons/mob/human_races/r_industrial.dmi'
|
||||
|
||||
eyes = "eyes_industry"
|
||||
show_ssd = "completely quiescent"
|
||||
|
||||
has_limbs = list(
|
||||
"chest" = list("path" = /obj/item/organ/external/chest/industrial),
|
||||
"groin" = list("path" = /obj/item/organ/external/groin/industrial),
|
||||
"head" = list("path" = /obj/item/organ/external/head/industrial),
|
||||
"l_arm" = list("path" = /obj/item/organ/external/arm/industrial),
|
||||
"r_arm" = list("path" = /obj/item/organ/external/arm/right/industrial),
|
||||
"l_leg" = list("path" = /obj/item/organ/external/leg/industrial),
|
||||
"r_leg" = list("path" = /obj/item/organ/external/leg/right/industrial),
|
||||
"l_hand" = list("path" = /obj/item/organ/external/hand/industrial),
|
||||
"r_hand" = list("path" = /obj/item/organ/external/hand/right/industrial),
|
||||
"l_foot" = list("path" = /obj/item/organ/external/foot/industrial),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/foot/right/industrial)
|
||||
)
|
||||
|
||||
heat_level_1 = 800
|
||||
heat_level_2 = 1300
|
||||
heat_level_3 = 2500
|
||||
|
||||
heat_discomfort_level = 800
|
||||
|
||||
max_nutrition_factor = 1.25
|
||||
nutrition_loss_factor = 2
|
||||
|
||||
sprint_speed_factor = 1.4
|
||||
|
||||
/datum/species/machine/industrial/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
H.bodytemperature += cost*0.9
|
||||
H.nutrition -= cost*1.1
|
||||
if (H.nutrition > 0)
|
||||
return 1
|
||||
else
|
||||
H.Weaken(60)
|
||||
H.m_intent = "walk"
|
||||
H.hud_used.move_intent.update_move_icon(H)
|
||||
H << span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in two minutes, initiate charging as primary directive.")
|
||||
playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
|
||||
return 0
|
||||
|
||||
/datum/species/machine/industrial/handle_death(var/mob/living/carbon/human/H)
|
||||
return
|
||||
|
||||
/datum/species/machine/terminator
|
||||
name = "Hunter-Killer"
|
||||
short_name = "hks"
|
||||
name_plural = "HKs"
|
||||
|
||||
blurb = "\[REDACTED\]"
|
||||
|
||||
icobase = 'icons/mob/human_races/r_terminator.dmi'
|
||||
deform = 'icons/mob/human_races/r_terminator.dmi'
|
||||
|
||||
unarmed_types = list(/datum/unarmed_attack/terminator)
|
||||
rarity_value = 20
|
||||
|
||||
language = "Hephaestus Darkcomms"
|
||||
name_language = "Hephaestus Darkcomms"
|
||||
|
||||
eyes = "eyes_terminator"
|
||||
has_floating_eyes = 1
|
||||
|
||||
brute_mod = 0.2
|
||||
burn_mod = 0.4
|
||||
flash_mod = 0
|
||||
siemens_coefficient = 0
|
||||
|
||||
show_ssd = "laying inert, its activation glyph dark."
|
||||
death_sound = 'sound/effects/bang.ogg'
|
||||
death_message = "collapses to the ground with a CLUNK, and begins to beep ominously."
|
||||
|
||||
heat_level_1 = 1500
|
||||
heat_level_2 = 2000
|
||||
heat_level_3 = 5000
|
||||
|
||||
body_temperature = null
|
||||
passive_temp_gain = 0
|
||||
|
||||
flags = NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON
|
||||
spawn_flags = IS_RESTRICTED
|
||||
vision_flags = SEE_SELF | SEE_MOBS
|
||||
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#575757"
|
||||
virus_immune = 1
|
||||
reagent_tag = IS_MACHINE
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/self_destruct,
|
||||
/mob/living/carbon/human/proc/detonate_flechettes,
|
||||
/mob/living/carbon/human/proc/state_laws
|
||||
)
|
||||
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/mmi_holder/posibrain/terminator,
|
||||
"shielded cell" = /obj/item/organ/cell/terminator,
|
||||
"optics" = /obj/item/organ/optical_sensor,
|
||||
"data core" = /obj/item/organ/data
|
||||
)
|
||||
|
||||
vision_organ = "optics"
|
||||
|
||||
has_limbs = list(
|
||||
"chest" = list("path" = /obj/item/organ/external/chest/terminator),
|
||||
"groin" = list("path" = /obj/item/organ/external/groin/terminator),
|
||||
"head" = list("path" = /obj/item/organ/external/head/terminator),
|
||||
"l_arm" = list("path" = /obj/item/organ/external/arm/terminator),
|
||||
"r_arm" = list("path" = /obj/item/organ/external/arm/right/terminator),
|
||||
"l_leg" = list("path" = /obj/item/organ/external/leg/terminator),
|
||||
"r_leg" = list("path" = /obj/item/organ/external/leg/right/terminator),
|
||||
"l_hand" = list("path" = /obj/item/organ/external/hand/terminator),
|
||||
"r_hand" = list("path" = /obj/item/organ/external/hand/right/terminator),
|
||||
"l_foot" = list("path" = /obj/item/organ/external/foot/terminator),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/foot/right/terminator)
|
||||
)
|
||||
|
||||
|
||||
heat_discomfort_level = 2000
|
||||
heat_discomfort_strings = list(
|
||||
"Your CPU temperature probes warn you that you are approaching critical heat levels!"
|
||||
)
|
||||
stamina = -1
|
||||
sprint_speed_factor = 1.25
|
||||
slowdown = 1
|
||||
|
||||
|
||||
/datum/species/machine/terminator/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
H.bodytemperature += cost*0.6
|
||||
H.nutrition -= cost*0.3
|
||||
if (H.nutrition > 0)
|
||||
return 1
|
||||
else
|
||||
H.Weaken(5)
|
||||
H.m_intent = "walk"
|
||||
H.hud_used.move_intent.update_move_icon(H)
|
||||
H << span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in 10 seconds, initiate charging as primary directive.")
|
||||
playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
|
||||
return 0
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
spawn(10)
|
||||
playsound(H.loc, 'sound/items/countdown.ogg', 125, 1)
|
||||
spawn(20)
|
||||
explosion(H, -1, -1, 5)
|
||||
H.gib()
|
||||
|
||||
/datum/species/machine/sanitize_name(var/new_name)
|
||||
return sanitizeName(new_name, allow_numbers = 1)
|
||||
@@ -2,6 +2,8 @@
|
||||
name = "Human"
|
||||
short_name = "hum"
|
||||
name_plural = "Humans"
|
||||
bodytype = "Human"
|
||||
age_max = 125
|
||||
primitive_form = "Monkey"
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
|
||||
blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
|
||||
@@ -21,13 +23,11 @@
|
||||
sprint_speed_factor = 0.9
|
||||
sprint_cost_factor = 0.5
|
||||
|
||||
/datum/species/human/get_bodytype()
|
||||
return "Human"
|
||||
|
||||
/datum/species/unathi
|
||||
name = "Unathi"
|
||||
short_name = "una"
|
||||
name_plural = "Unathi"
|
||||
bodytype = "Unathi"
|
||||
icobase = 'icons/mob/human_races/r_lizard.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_lizard.dmi'
|
||||
tail = "sogtail"
|
||||
@@ -99,6 +99,7 @@
|
||||
name = "Tajara"
|
||||
short_name = "taj"
|
||||
name_plural = "Tajaran"
|
||||
bodytype = "Tajara"
|
||||
icobase = 'icons/mob/human_races/r_tajaran.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
|
||||
tail = "tajtail"
|
||||
@@ -152,13 +153,12 @@
|
||||
..()
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
|
||||
|
||||
/datum/species/tajaran/get_bodytype()
|
||||
return "Tajara"
|
||||
|
||||
/datum/species/skrell
|
||||
name = "Skrell"
|
||||
short_name = "skr"
|
||||
name_plural = "Skrell"
|
||||
bodytype = "Skrell"
|
||||
age_max = 500
|
||||
icobase = 'icons/mob/human_races/r_skrell.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_skrell.dmi'
|
||||
eyes = "skrell_eyes_s"
|
||||
@@ -192,6 +192,8 @@
|
||||
name = "Diona"
|
||||
short_name = "dio"
|
||||
name_plural = "Dionaea"
|
||||
bodytype = "Diona"
|
||||
age_max = 1000
|
||||
icobase = 'icons/mob/human_races/r_diona.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_plant.dmi'
|
||||
language = "Ceti Basic"
|
||||
@@ -322,16 +324,20 @@
|
||||
if (!gibbed)
|
||||
H.diona_split_into_nymphs(0)
|
||||
|
||||
/datum/species/machine
|
||||
name = "Machine"
|
||||
short_name = "ipc"
|
||||
name_plural = "machines"
|
||||
|
||||
blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \
|
||||
robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \
|
||||
to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \
|
||||
generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \
|
||||
inhuman in outlook and perspective."
|
||||
/datum/species/machine
|
||||
name = "Baseline Frame"
|
||||
short_name = "ipc"
|
||||
name_plural = "Baselines"
|
||||
bodytype = "Machine"
|
||||
age_min = 1
|
||||
age_max = 30
|
||||
|
||||
blurb = "IPCs are, quite simply, 'Integrated Positronic Chassis'. In this scenario, positronic does not mean anything significant - it is a nickname given \
|
||||
to all advanced processing units, based on the works of vintage writer Isaac Asimov. The long of the short is that they represent all unbound synthetic \
|
||||
units.Assembly produced, simple IPC units. Simple skeleton designed for minimal use, generally in civilian roles. The most common form of chassis used by \
|
||||
IPCs, first designed and produced by Hephaestus Industries in the early years of synthetic production. It has become ubiquitous, and for all of its many \
|
||||
faults - its shoddy coolant systems and fragile frame - it would be very odd to see a standard IPC without it."
|
||||
|
||||
icobase = 'icons/mob/human_races/r_machine.dmi'
|
||||
deform = 'icons/mob/human_races/r_machine.dmi'
|
||||
@@ -345,7 +351,6 @@
|
||||
ethanol_resistance = -1//Can't get drunk
|
||||
radiation_mod = 0 // not affected by radiation
|
||||
|
||||
eyes = "blank_eyes"
|
||||
// #TODO-MERGE: Check for balance and self-repair. If self-repair is a thing, RIP balance.
|
||||
brute_mod = 0.5
|
||||
burn_mod = 1.0
|
||||
@@ -370,6 +375,7 @@
|
||||
passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment.
|
||||
|
||||
flags = NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON | NO_MINOR_CUT
|
||||
appearance_flags = HAS_SKIN_COLOR
|
||||
spawn_flags = CAN_JOIN | IS_WHITELISTED
|
||||
|
||||
blood_color = "#1F181F"
|
||||
@@ -380,7 +386,8 @@
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/mmi_holder/posibrain,
|
||||
"cell" = /obj/item/organ/cell,
|
||||
"optics" = /obj/item/organ/optical_sensor
|
||||
"optics" = /obj/item/organ/optical_sensor,
|
||||
"ipc tag" = /obj/item/organ/ipc_tag
|
||||
)
|
||||
|
||||
vision_organ = "optics"
|
||||
@@ -407,6 +414,10 @@
|
||||
stamina = -1 // Machines use power and generate heat, stamina is not a thing
|
||||
sprint_speed_factor = 1 // About as capable of speed as a human
|
||||
|
||||
datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
H.gender = NEUTER
|
||||
. = ..()
|
||||
check_tag(H, H.client)
|
||||
|
||||
/datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
@@ -431,11 +442,64 @@
|
||||
/datum/species/machine/sanitize_name(var/new_name)
|
||||
return sanitizeName(new_name, allow_numbers = 1)
|
||||
|
||||
/datum/species/machine/proc/check_tag(var/mob/living/carbon/human/new_machine, var/client/player)
|
||||
if (!new_machine || !player)
|
||||
return
|
||||
|
||||
establish_db_connection()
|
||||
|
||||
if (dbcon.IsConnected())
|
||||
var/obj/item/organ/ipc_tag/tag = new_machine.internal_organs_by_name["ipc tag"]
|
||||
|
||||
var/status = 0
|
||||
var/list/query_details = list(":ckey" = player.ckey, ":character_name" = player.prefs.real_name)
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey AND character_name = :character_name")
|
||||
query.Execute(query_details)
|
||||
|
||||
if (query.NextRow())
|
||||
status = text2num(query.item[1])
|
||||
else
|
||||
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO ss13_ipc_tracking (player_ckey, character_name) VALUES (:ckey, :character_name)")
|
||||
log_query.Execute(query_details)
|
||||
|
||||
if (!status)
|
||||
new_machine.internal_organs_by_name.Remove("ipc tag")
|
||||
new_machine.internal_organs.Remove(tag)
|
||||
qdel(tag)
|
||||
|
||||
/datum/species/machine/proc/update_tag(var/mob/living/carbon/human/target, var/client/player)
|
||||
if (!target || !player)
|
||||
return
|
||||
|
||||
establish_db_connection()
|
||||
|
||||
if (dbcon.IsConnected())
|
||||
var/status = 0
|
||||
var/sql_status = 0
|
||||
if (target.internal_organs_by_name["ipc tag"])
|
||||
status = 1
|
||||
|
||||
var/list/query_details = list(":ckey" = player.ckey, ":character_name" = target.real_name)
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey AND character_name = :character_name")
|
||||
query.Execute(query_details)
|
||||
|
||||
if (query.NextRow())
|
||||
sql_status = text2num(query.item[1])
|
||||
if (sql_status == status)
|
||||
return
|
||||
|
||||
query_details.Add(":status")
|
||||
query_details[":status"] = status
|
||||
var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ipc_tracking SET tag_status = :status WHERE player_ckey = :ckey AND character_name = :character_name")
|
||||
update_query.Execute(query_details)
|
||||
|
||||
/datum/species/bug
|
||||
name = "Vaurca Worker"
|
||||
short_name = "vau"
|
||||
name_plural = "Type A"
|
||||
bodytype = "Vaurca"
|
||||
age_min = 1
|
||||
age_max = 20
|
||||
language = LANGUAGE_VAURCA
|
||||
primitive_form = "V'krexi"
|
||||
greater_form = "Vaurca Warrior"
|
||||
@@ -478,8 +542,8 @@
|
||||
spawn_flags = CAN_JOIN | IS_WHITELISTED
|
||||
appearance_flags = HAS_SKIN_COLOR
|
||||
blood_color = "#E6E600" // dark yellow
|
||||
flesh_color = "#330000"
|
||||
base_color = "#330000"
|
||||
flesh_color = "#E6E600"
|
||||
base_color = "#575757"
|
||||
|
||||
death_message = "chitters faintly before crumbling to the ground, their eyes dead and lifeless..."
|
||||
halloss_message = "crumbles to the ground, too weak to continue fighting."
|
||||
@@ -500,12 +564,20 @@
|
||||
sprint_cost_factor = 0.30
|
||||
stamina_recovery = 2//slow recovery
|
||||
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/bugbite //weaker version of gut.
|
||||
)
|
||||
|
||||
|
||||
has_organ = list(
|
||||
"neural socket" = /obj/item/organ/vaurca/neuralsocket,
|
||||
"lungs" = /obj/item/organ/lungs,
|
||||
"filtration bit" = /obj/item/organ/vaurca/filtrationbit,
|
||||
"lungs" = /obj/item/organ/lungs,
|
||||
"heart" = /obj/item/organ/heart,
|
||||
"phoron reserve tank" = /obj/item/organ/vaurca/preserve,
|
||||
"right heart" = /obj/item/organ/heart/right,
|
||||
"second heart" = /obj/item/organ/heart,
|
||||
"left heart" = /obj/item/organ/heart/left,
|
||||
"liver" = /obj/item/organ/liver,
|
||||
"kidneys" = /obj/item/organ/kidneys,
|
||||
|
||||
@@ -708,7 +708,7 @@
|
||||
/mob/proc/is_mechanical()
|
||||
if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI"))
|
||||
return 1
|
||||
return istype(src, /mob/living/silicon) || get_species() == "Machine"
|
||||
return istype(src, /mob/living/silicon) || get_species() == "Baseline Frame" || get_species() == "Shell Frame" || get_species() == "Industrial Frame"
|
||||
|
||||
/mob/proc/is_ready()
|
||||
return client && !!mind
|
||||
|
||||
@@ -65,8 +65,16 @@
|
||||
return 0
|
||||
|
||||
/proc/isipc(A)
|
||||
if(istype(A, /mob/living/carbon/human) && (A:get_species() == "Machine"))
|
||||
return 1
|
||||
if(istype(A, /mob/living/carbon/human))
|
||||
switch(A:get_species())
|
||||
if ("Baseline Frame")
|
||||
return 1
|
||||
if ("Industrial Frame")
|
||||
return 1
|
||||
if ("Shell Frame")
|
||||
return 1
|
||||
if ("Hunter-Killer")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isvox(A)
|
||||
@@ -74,8 +82,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/mob/proc/is_diona()
|
||||
//returns which type of diona we are, or zero
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
|
||||
@@ -196,8 +196,17 @@ datum/preferences
|
||||
qdel(preview_icon_side)
|
||||
qdel(preview_icon)
|
||||
|
||||
var/g = "m"
|
||||
if(gender == FEMALE) g = "f"
|
||||
var/genderhead = "head"
|
||||
var/gendergroin = "groin"
|
||||
var/genderbust = "torso"
|
||||
if(gender == FEMALE)
|
||||
genderhead = "head_f"
|
||||
gendergroin = "groin_f"
|
||||
genderbust = "torso_f"
|
||||
else if(gender == MALE)
|
||||
genderhead = "head_m"
|
||||
gendergroin = "groin_m"
|
||||
genderbust = "torso_m"
|
||||
|
||||
var/icon/icobase
|
||||
var/datum/species/current_species = all_species[species]
|
||||
@@ -207,17 +216,21 @@ datum/preferences
|
||||
else
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
preview_icon = new /icon(icobase, "torso_[g]")
|
||||
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
|
||||
preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
|
||||
|
||||
preview_icon = new /icon('icons/effects/effects.dmi', "nothing")
|
||||
|
||||
//Non-robotic limbs
|
||||
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
|
||||
if(organ_data[name] == "amputated") continue
|
||||
if(organ_data[name] == "cyborg")
|
||||
for(var/organname in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand","groin","chest","head"))
|
||||
if(organ_data[organname] == "amputated") continue
|
||||
if(organ_data[organname] == "cyborg")
|
||||
continue//We will add the icons for robolimbs after the skin color is applied
|
||||
preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY)
|
||||
if(organname == "head")
|
||||
preview_icon.Blend(new /icon(icobase, "[genderhead]"), ICON_OVERLAY)
|
||||
else if(organname == "groin")
|
||||
preview_icon.Blend(new /icon(icobase, "[gendergroin]"), ICON_OVERLAY)
|
||||
else if(organname == "chest")
|
||||
preview_icon.Blend(new /icon(icobase, "[genderbust]"), ICON_OVERLAY)
|
||||
else
|
||||
preview_icon.Blend(new /icon(icobase, "[organname]"), ICON_OVERLAY)
|
||||
|
||||
//Tail
|
||||
if(current_species && (current_species.tail))
|
||||
@@ -237,12 +250,19 @@ datum/preferences
|
||||
|
||||
|
||||
//Robotic limbs, done AFTER skin color/tone blending
|
||||
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
|
||||
if(organ_data[name] == "cyborg")
|
||||
for(var/roboname in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand","groin","chest","head"))
|
||||
if(organ_data[roboname] == "cyborg")
|
||||
var/datum/robolimb/R
|
||||
if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]]
|
||||
if(rlimb_data[roboname]) R = all_robolimbs[rlimb_data[roboname]]
|
||||
if(!R) R = basic_robolimb
|
||||
preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic.
|
||||
if(roboname == "head")
|
||||
preview_icon.Blend(icon(R.icon, "[genderhead]"), ICON_OVERLAY)
|
||||
else if(roboname == "groin")
|
||||
preview_icon.Blend(icon(R.icon, "[gendergroin]"), ICON_OVERLAY)
|
||||
else if(roboname == "chest")
|
||||
preview_icon.Blend(icon(R.icon, "[genderbust]"), ICON_OVERLAY)
|
||||
else
|
||||
preview_icon.Blend(icon(R.icon, "[roboname]"), ICON_OVERLAY)
|
||||
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
|
||||
|
||||
@@ -932,8 +932,6 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
if(company)
|
||||
model = company
|
||||
var/datum/robolimb/R = all_robolimbs[company]
|
||||
if(species && (species.name in R.species_cannot_use))
|
||||
R = basic_robolimb
|
||||
if(R)
|
||||
force_icon = R.icon
|
||||
name = "[R.company] [initial(name)]"
|
||||
|
||||
@@ -16,7 +16,7 @@ var/global/list/limb_icon_cache = list()
|
||||
s_tone = null
|
||||
s_col = null
|
||||
h_col = null
|
||||
if(status & ORGAN_ROBOT)
|
||||
if(status & ORGAN_ROBOT && !(isipc(human)))
|
||||
return
|
||||
if(species && human.species && species.name != human.species.name)
|
||||
return
|
||||
|
||||
@@ -15,7 +15,7 @@ var/global/datum/robolimb/basic_robolimb
|
||||
var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb.
|
||||
var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from.
|
||||
var/unavailable_at_chargen // If set, not available at chargen.
|
||||
var/list/species_cannot_use = list("Resomi")
|
||||
var/list/species_can_use = list("Human","Skrell","Tajara","Zhan-Khaza","M'sai","Unathi","Vaurca Worker","Vaurca Warrior","Baseline Frame")
|
||||
|
||||
/datum/robolimb/bishop
|
||||
company = "Bishop Cybernetics"
|
||||
@@ -42,3 +42,45 @@ var/global/datum/robolimb/basic_robolimb
|
||||
desc = "This limb is simple and functional; no effort has been made to make it look human."
|
||||
icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
|
||||
unavailable_at_chargen = 1
|
||||
|
||||
/datum/robolimb/industrial
|
||||
company = "Hephaestus Industrial Limb"
|
||||
desc = "This limb is more robust than the standard Hephaestus Integrated Limb, and is better suited for industrial machinery."
|
||||
icon = 'icons/mob/human_races/r_industrial.dmi'
|
||||
unavailable_at_chargen = 1
|
||||
|
||||
/datum/robolimb/terminator
|
||||
company = "Hephaestus Vulcanite Limb"
|
||||
desc = "A ludicrously expensive and EMP shielded component, these types of limbs are best suited for highly specialized cyborgs."
|
||||
icon = 'icons/mob/human_races/r_terminator.dmi'
|
||||
unavailable_at_chargen = 1
|
||||
|
||||
/datum/robolimb/human
|
||||
company = "Human Synthskin"
|
||||
desc = "This limb is designed to mimic the Human form. It does so with moderate success."
|
||||
icon = 'icons/mob/human_races/r_human.dmi'
|
||||
species_can_use = list("Human")
|
||||
|
||||
/datum/robolimb/unathi
|
||||
company = "Unathi Synthskin"
|
||||
desc = "This limb is designed to mimic the Unathi form. It does so with moderate success."
|
||||
icon = 'icons/mob/human_races/r_lizard.dmi'
|
||||
species_can_use = list("Unathi")
|
||||
|
||||
/datum/robolimb/tajara
|
||||
company = "Tajara Synthskin"
|
||||
desc = "This limb is designed to mimic the Tajaran form. It does so with moderate success."
|
||||
icon = 'icons/mob/human_races/r_tajaran.dmi'
|
||||
species_can_use = list("Tajara","Zhan-Khaza","M'sai")
|
||||
|
||||
/datum/robolimb/skrell
|
||||
company = "Skrell Synthskin"
|
||||
desc = "This limb is designed to mimic the Skrellian form. It does so with moderate success."
|
||||
icon = 'icons/mob/human_races/r_skrell.dmi'
|
||||
species_can_use = list("Skrell")
|
||||
|
||||
/datum/robolimb/vaurca
|
||||
company = "Vaurca Synthskin"
|
||||
desc = "This limb is designed to mimic the Vaurcae form. It does so with moderate success."
|
||||
icon = 'icons/mob/human_races/r_vaurca.dmi'
|
||||
species_can_use = list("Vaurca Worker","Vaurca Warrior")
|
||||
@@ -6,7 +6,7 @@
|
||||
max_damage = 50 //made same as arm, since it is not vital
|
||||
min_broken_damage = 30
|
||||
encased = null
|
||||
|
||||
|
||||
/obj/item/organ/external/head/ipc/New()
|
||||
robotize("Hephaestus Integrated Limb")
|
||||
..()
|
||||
@@ -104,6 +104,18 @@
|
||||
robotize()
|
||||
..()
|
||||
|
||||
/obj/item/organ/ipc_tag
|
||||
name = "identification tag"
|
||||
organ_tag = "ipc tag"
|
||||
parent_organ = "groin"
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "gps-c"
|
||||
dead_icon = "gps-c"
|
||||
|
||||
/obj/item/organ/ipc_tag/New()
|
||||
robotize()
|
||||
..()
|
||||
|
||||
// Used for an MMI or posibrain being installed into a human.
|
||||
/obj/item/organ/mmi_holder
|
||||
name = "brain"
|
||||
@@ -155,3 +167,183 @@
|
||||
else
|
||||
stored_mmi.loc = get_turf(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
//terminator organs
|
||||
|
||||
/obj/item/organ/mmi_holder/posibrain/terminator
|
||||
name = "brain"
|
||||
organ_tag = "brain"
|
||||
parent_organ = "chest"
|
||||
vital = 1
|
||||
|
||||
/obj/item/organ/data
|
||||
name = "data core"
|
||||
organ_tag = "data core"
|
||||
parent_organ = "groin"
|
||||
icon = 'icons/obj/cloning.dmi'
|
||||
icon_state = "harddisk"
|
||||
vital = 0
|
||||
|
||||
/obj/item/organ/data/New()
|
||||
robotize()
|
||||
..()
|
||||
|
||||
/obj/item/organ/cell/terminator
|
||||
name = "shielded microbattery"
|
||||
desc = "A small, powerful cell for use in fully prosthetic bodies. Equipped with a Faraday shield."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "scell"
|
||||
organ_tag = "shielded cell"
|
||||
parent_organ = "chest"
|
||||
vital = 1
|
||||
|
||||
/obj/item/organ/cell/New()
|
||||
mechassist()
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/head/terminator
|
||||
dislocated = -1
|
||||
can_intake_reagents = 0
|
||||
vital = 0
|
||||
max_damage = 50 //made same as arm, since it is not vital
|
||||
min_broken_damage = 30
|
||||
encased = null
|
||||
|
||||
/obj/item/organ/external/head/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/chest/terminator
|
||||
dislocated = -1
|
||||
encased = null
|
||||
/obj/item/organ/external/chest/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/groin/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/groin/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/arm/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/arm/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/arm/right/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/arm/right/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/leg/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/leg/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/leg/right/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/leg/right/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/foot/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/foot/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/foot/right/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/foot/right/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/hand/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/hand/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/hand/right/terminator
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/hand/right/terminator/New()
|
||||
mechassist("Hephaestus Vulcanite Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/head/industrial
|
||||
dislocated = -1
|
||||
can_intake_reagents = 0
|
||||
vital = 0
|
||||
max_damage = 50 //made same as arm, since it is not vital
|
||||
min_broken_damage = 30
|
||||
encased = null
|
||||
|
||||
/obj/item/organ/external/head/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/chest/industrial
|
||||
dislocated = -1
|
||||
encased = null
|
||||
/obj/item/organ/external/chest/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/groin/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/groin/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/arm/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/arm/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/arm/right/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/arm/right/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/leg/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/leg/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/leg/right/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/leg/right/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/foot/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/foot/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/foot/right/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/foot/right/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/hand/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/hand/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/hand/right/industrial
|
||||
dislocated = -1
|
||||
/obj/item/organ/external/hand/right/industrial/New()
|
||||
robotize("Hephaestus Industrial Limb")
|
||||
..()
|
||||
@@ -373,6 +373,35 @@
|
||||
/obj/item/ammo_magazine/d762/empty
|
||||
initial_ammo = 0
|
||||
|
||||
/obj/item/ammo_magazine/flechette
|
||||
name = "flechette rounds"
|
||||
icon = 'icons/obj/terminator.dmi'
|
||||
icon_state = "flechette"
|
||||
mag_type = MAGAZINE
|
||||
caliber = "flechette"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1200)
|
||||
ammo_type = /obj/item/ammo_casing/flechette
|
||||
max_ammo = 40
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_magazine/flechette/empty
|
||||
initial_ammo = 0
|
||||
|
||||
/obj/item/ammo_magazine/flechette/explosive
|
||||
name = "explosive flechette rounds"
|
||||
desc = "A box of ten explosive flechettes that can be remotely detonated by a certain signal."
|
||||
icon = 'icons/obj/terminator.dmi'
|
||||
icon_state = "flechette_e"
|
||||
mag_type = MAGAZINE
|
||||
caliber = "flechette"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1200)
|
||||
ammo_type = /obj/item/ammo_casing/flechette/explosive
|
||||
max_ammo = 10
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_magazine/flechette/explosive/empty
|
||||
initial_ammo = 0
|
||||
|
||||
/obj/item/ammo_magazine/assault_shotgun
|
||||
name = "magazine (slug)"
|
||||
icon = 'icons/obj/dragunov.dmi'
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
|
||||
/obj/item/ammo_casing/trod
|
||||
desc = "Hyperdense tungsten rod residue."
|
||||
desc = "hyperdense tungsten rod residue."
|
||||
icon_state = "trod"
|
||||
caliber = "trod"
|
||||
projectile_type = /obj/item/projectile/bullet/trod
|
||||
@@ -226,3 +226,13 @@
|
||||
color = "#FF0000"
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/cap
|
||||
|
||||
/obj/item/ammo_casing/flechette
|
||||
desc = "A flechette casing."
|
||||
icon = 'icons/obj/terminator.dmi'
|
||||
icon_state = "flechette_casing"
|
||||
caliber = "flechette"
|
||||
projectile_type = /obj/item/projectile/bullet/flechette
|
||||
|
||||
/obj/item/ammo_casing/flechette/explosive
|
||||
projectile_type = /obj/item/projectile/bullet/flechette/explosive
|
||||
|
||||
|
||||
@@ -137,7 +137,6 @@
|
||||
/obj/effect/projectile/bullet/muzzle
|
||||
icon_state = "muzzle_bullet"
|
||||
|
||||
//----------------------------
|
||||
// Solar beam
|
||||
//----------------------------
|
||||
/obj/effect/projectile/solar/tracer
|
||||
@@ -148,3 +147,9 @@
|
||||
|
||||
/obj/effect/projectile/solar/impact
|
||||
icon_state = "impact_solar"
|
||||
|
||||
//----------------------------
|
||||
// Pulse muzzle
|
||||
//----------------------------
|
||||
/obj/effect/projectile/pulse_bullet/muzzle
|
||||
icon_state = "muzzle_pulse"
|
||||
|
||||
@@ -311,6 +311,64 @@
|
||||
list(mode_name="dual coil", burst=2, move_delay=8, accuracy = list(-2,-3), dispersion = list(2.0, 3.0))
|
||||
)
|
||||
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/terminator
|
||||
name = "flechette rifle"
|
||||
desc = "A fearsome Necropolis Industries designed rifle with attached bayonet that fires lethal flechette rounds."
|
||||
icon = 'icons/obj/terminator.dmi'
|
||||
icon_state = "flechetterifle"
|
||||
item_state = "flechetterifle"
|
||||
contained_sprite = 1
|
||||
w_class = 5
|
||||
force = 30
|
||||
caliber = "flechette"
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
fire_sound = 'sound/weapons/Gunshot_DMR.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/flechette
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/flechette,/obj/item/ammo_magazine/flechette/explosive)
|
||||
auto_eject = 1
|
||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
|
||||
list(mode_name="short bursts", burst=5, move_delay=4, burst_accuracy=list(0,-1,-1,-2,-2), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2))
|
||||
)
|
||||
|
||||
|
||||
fire_delay = 20
|
||||
accuracy = -4
|
||||
|
||||
//wielding information
|
||||
fire_delay_wielded = 5
|
||||
accuracy_wielded = 0
|
||||
scoped_accuracy = 2
|
||||
|
||||
action_button_name = "Wield rifle"
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/terminator/verb/scope()
|
||||
set category = "Object"
|
||||
set name = "Use Scope"
|
||||
set popup_menu = 1
|
||||
|
||||
if(wielded)
|
||||
toggle_scope(2.0)
|
||||
else
|
||||
usr << "<span class='warning'>You can't look through the scope without stabilizing the rifle!</span>"
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/terminator/can_wield()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/terminator/ui_action_click()
|
||||
if(src in usr)
|
||||
toggle_wield(usr)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/terminator/verb/wield_rifle()
|
||||
set name = "Wield rifle"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/rifle/shotgun
|
||||
name = "assault shotgun"
|
||||
desc = "A experimental, semi-automatic combat shotgun, designed for boarding operations and law enforcement agencies."
|
||||
@@ -345,3 +403,4 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/rifle/shotgun/update_icon()
|
||||
..()
|
||||
icon_state = (ammo_magazine)? "cshotgun" : "cshotgun-empty"
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
var/agony = 0
|
||||
var/incinerate = 0
|
||||
var/embed = 0 // whether or not the projectile can embed itself in the mob
|
||||
var/shrapnel_type //type of shrapnel the projectile leaves in its target.
|
||||
|
||||
var/hitscan = 0 // whether the projectile should be hitscan
|
||||
var/step_delay = 1 // the delay between iterations if not a hitscan projectile
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
check_armour = "bullet"
|
||||
embed = 1
|
||||
sharp = 1
|
||||
shrapnel_type = /obj/item/weapon/material/shard/shrapnel
|
||||
var/mob_passthrough_check = 0
|
||||
|
||||
muzzle_type = /obj/effect/projectile/bullet/muzzle
|
||||
@@ -296,3 +297,21 @@
|
||||
/obj/item/projectile/bullet/pistol/cap/process()
|
||||
loc = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/bullet/flechette
|
||||
name = "flechette"
|
||||
icon = 'icons/obj/terminator.dmi'
|
||||
icon_state = "flechette_bullet"
|
||||
damage = 40
|
||||
damage_type = BRUTE
|
||||
check_armour = "bullet"
|
||||
embed = 1
|
||||
sharp = 1
|
||||
penetrating = 1
|
||||
|
||||
muzzle_type = /obj/effect/projectile/pulse_bullet/muzzle
|
||||
|
||||
/obj/item/projectile/bullet/flechette/explosive
|
||||
shrapnel_type = /obj/item/weapon/material/shard/shrapnel/flechette
|
||||
penetrating = 0
|
||||
damage = 10
|
||||
@@ -0,0 +1,40 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: LordFowl
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "Added two new IPC subspecies - Shell Frame and Industrial Frame. Renamed main species to Baseline Frame."
|
||||
- rscadd: "All IPCs now spawn with the tagger organ in their groin, which accurately identifies them unless removed."
|
||||
- rscadd: "Organics can select synthskin prosthetics, but only of their own species."
|
||||
- tweak: "Shells can now only mimic a single species - no more multi-species abominations."
|
||||
- bugfix: "IPCs can now change their body colour."
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 289 KiB After Width: | Height: | Size: 290 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 920 B After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |