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

This commit is contained in:
Anewbe
2017-10-22 19:06:09 -05:00
106 changed files with 1189 additions and 372 deletions
+5 -5
View File
@@ -860,7 +860,7 @@ proc/admin_notice(var/message, var/rights)
set desc="Delay the game start/end"
set name="Delay"
if(!check_rights(R_SERVER)) return
if(!check_rights(R_SERVER|R_EVENT)) return
if (!ticker || ticker.current_state != GAME_STATE_PREGAME)
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
@@ -1225,16 +1225,16 @@ proc/admin_notice(var/message, var/rights)
/*
helper proc to test if someone is a mentor or not. Got tired of writing this same check all over the place.
helper proc to test if someone is an event manager or not. Got tired of writing this same check all over the place.
*/
/proc/is_mentor(client/C)
/proc/is_eventM(client/C)
if(!istype(C))
return 0
if(!C.holder)
return 0
if(C.holder.rights == R_MENTOR)
if(C.holder.rights == R_EVENT)
return 1
return 0
@@ -1266,7 +1266,7 @@ proc/admin_notice(var/message, var/rights)
var/ref_mob = "\ref[M]"
return "<b>[key_name(C, link, name, highlight_special)](<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>)([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;take_question=\ref[M]'>TAKE</A>)</b>"
if(4) //Mentors
if(4) //Event Managers
var/ref_mob = "\ref[M]"
return "<b>[key_name(C, link, name, highlight_special)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;take_question=\ref[M]'>TAKE</A>)</b>"
+2 -2
View File
@@ -37,11 +37,11 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
if("stealth") rights |= R_STEALTH
if("rejuv","rejuvinate") rights |= R_REJUVINATE
if("varedit") rights |= R_VAREDIT
if("everything","host","all") rights |= (R_HOST | R_BUILDMODE | R_ADMIN | R_BAN | R_FUN | R_SERVER | R_DEBUG | R_PERMISSIONS | R_POSSESS | R_STEALTH | R_REJUVINATE | R_VAREDIT | R_SOUNDS | R_SPAWN | R_MOD| R_MENTOR)
if("everything","host","all") rights |= (R_HOST | R_BUILDMODE | R_ADMIN | R_BAN | R_FUN | R_SERVER | R_DEBUG | R_PERMISSIONS | R_POSSESS | R_STEALTH | R_REJUVINATE | R_VAREDIT | R_SOUNDS | R_SPAWN | R_MOD| R_EVENT)
if("sound","sounds") rights |= R_SOUNDS
if("spawn","create") rights |= R_SPAWN
if("mod") rights |= R_MOD
if("mentor") rights |= R_MENTOR
if("event") rights |= R_EVENT
admin_ranks[rank] = rights
previous_rights = rights
+43 -11
View File
@@ -8,7 +8,7 @@ var/list/admin_verbs_default = list(
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify,
// /client/proc/check_antagonists, //shows all antags,
// /client/proc/cmd_mod_say,
/client/proc/cmd_mentor_check_new_players,
/client/proc/cmd_eventM_check_new_players,
// /client/proc/deadchat //toggles deadchat on/off,
// /client/proc/toggle_ahelp_sound,
)
@@ -186,7 +186,7 @@ var/list/admin_verbs_debug = list(
/client/proc/cmd_debug_tog_aliens,
/client/proc/air_report,
/client/proc/reload_admins,
/client/proc/reload_mentors,
/client/proc/reload_eventMs,
/client/proc/restart_controller,
/datum/admins/proc/restart,
/client/proc/print_random_map,
@@ -327,19 +327,53 @@ var/list/admin_verbs_mod = list(
/client/proc/getserverlog, //allows us to fetch server logs (diary) for other days,
/datum/admins/proc/view_txt_log, //shows the server log (diary) for today,
/datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently,
)
var/list/admin_verbs_mentor = list(
var/list/admin_verbs_event_manager = list(
/client/proc/cmd_admin_pm_context,
/client/proc/cmd_admin_pm_panel,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost,
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
// /client/proc/dsay,
/client/proc/cmd_admin_subtle_message
/client/proc/dsay,
/client/proc/cmd_admin_subtle_message,
/client/proc/debug_variables,
/client/proc/check_antagonists,
/client/proc/aooc,
/datum/admins/proc/paralyze_mob,
/client/proc/cmd_admin_direct_narrate,
/client/proc/allow_character_respawn,
/datum/admins/proc/sendFax,
/client/proc/respawn_character,
/proc/possess,
/proc/release,
/client/proc/callproc,
/client/proc/callproc_target,
/client/proc/debug_controller,
/client/proc/show_gm_status,
/datum/admins/proc/change_weather,
/datum/admins/proc/change_time,
/client/proc/admin_give_modifier,
/client/proc/Jump,
/client/proc/jumptomob,
/client/proc/jumptocoord,
/client/proc/cmd_admin_delete,
/datum/admins/proc/delay,
/client/proc/Set_Holiday,
/client/proc/make_sound,
/client/proc/toggle_random_events,
/datum/admins/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/make_sound,
/client/proc/toggle_random_events,
/client/proc/editappear,
/client/proc/roll_dices,
/datum/admins/proc/call_supply_drop,
/datum/admins/proc/call_drop_pod
)
/client/proc/add_admin_verbs()
@@ -361,7 +395,7 @@ var/list/admin_verbs_mentor = list(
if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds
if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn
if(holder.rights & R_MOD) verbs += admin_verbs_mod
if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor
if(holder.rights & R_EVENT) verbs += admin_verbs_event_manager
/client/proc/remove_admin_verbs()
verbs.Remove(
@@ -424,12 +458,10 @@ var/list/admin_verbs_mentor = list(
if(istype(mob,/mob/observer/dead))
//re-enter
var/mob/observer/dead/ghost = mob
if(!is_mentor(usr.client))
ghost.can_reenter_corpse = 1
if(ghost.can_reenter_corpse)
ghost.reenter_corpse()
else
ghost << "<font color='red'>Error: Aghost: Can't reenter corpse, mentors that use adminHUD while aghosting are not permitted to enter their corpse again</font>"
ghost << "<font color='red'>Error: Aghost: Can't reenter corpse, event managers that use adminHUD while aghosting are not permitted to enter their corpse again</font>"
return
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -367,7 +367,7 @@
if(usr.client)
var/client/C = usr.client
if(is_mentor(C))
if(is_eventM(C))
dat += {"<td align=center> N/A </td>"}
else
switch(is_special_character(M))
+6 -6
View File
@@ -237,7 +237,7 @@
href_list["secretsadmin"] = "check_antagonist"
else if(href_list["delay_round_end"])
if(!check_rights(R_SERVER)) return
if(!check_rights(R_SERVER|R_EVENT)) return
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
@@ -1194,7 +1194,7 @@
show_player_panel(M)
else if(href_list["adminplayerobservejump"])
if(!check_rights(R_MENTOR|R_MOD|R_ADMIN|R_SERVER)) return
if(!check_rights(R_EVENT|R_MOD|R_ADMIN|R_SERVER|R_EVENT)) return
var/mob/M = locate(href_list["adminplayerobservejump"])
@@ -1204,7 +1204,7 @@
C.jumptomob(M)
else if(href_list["adminplayerobservefollow"])
if(!check_rights(R_MENTOR|R_MOD|R_ADMIN|R_SERVER))
if(!check_rights(R_EVENT|R_MOD|R_ADMIN|R_SERVER|R_EVENT))
return
var/mob/M = locate(href_list["adminplayerobservefollow"])
@@ -1224,14 +1224,14 @@
if(ismob(M))
var/take_msg = "<span class='notice'><b>ADMINHELP</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> adminhelp, please don't dogpile them.</span>"
for(var/client/X in admins)
if((R_ADMIN|R_MOD|R_MENTOR) & X.holder.rights)
if((R_ADMIN|R_MOD|R_EVENT) & X.holder.rights)
to_chat(X, take_msg)
to_chat(M, "<span class='notice'><b>Your adminhelp is being attended to by [usr.client]. Thanks for your patience!</b></span>")
else
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
else if(href_list["adminplayerobservecoodjump"])
if(!check_rights(R_ADMIN|R_SERVER|R_MOD)) return
if(!check_rights(R_ADMIN|R_SERVER|R_MOD|R_EVENT)) return
var/x = text2num(href_list["X"])
var/y = text2num(href_list["Y"])
@@ -1843,7 +1843,7 @@
vsc.SetDefault(usr)
else if(href_list["toglang"])
if(check_rights(R_SPAWN))
if(check_rights(R_SPAWN|R_EVENT))
var/mob/M = locate(href_list["toglang"])
if(!istype(M))
usr << "[M] is illegal type, must be /mob!"
+3 -7
View File
@@ -88,24 +88,20 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(ai_found)
ai_cl = " (<A HREF='?_src_=holder;adminchecklaws=\ref[mob]'>CL</A>)"
//Options bar: mob, details ( admin = 2, dev = 3, mentor = 4, character name (0 = just ckey, 1 = ckey and character name), link? (0 no don't make it a link, 1 do so),
//Options bar: mob, details ( admin = 2, dev = 3, event manager = 4, character name (0 = just ckey, 1 = ckey and character name), link? (0 no don't make it a link, 1 do so),
// highlight special roles (0 = everyone has same looking name, 1 = antags / special roles get a golden name)
var/mentor_msg = "<b><font color=red>Request for Help: </font></b><font color='blue'><b>[get_options_bar(mob, 4, 1, 1, 0)][ai_cl]:</b> [msg]</font>"
msg = "<b><font color=red>Request for Help: </font></b><font color='blue'><b>[get_options_bar(mob, 2, 1, 1)][ai_cl]</b> [msg]</font>"
var/admin_number_afk = 0
for(var/client/X in admins)
if((R_ADMIN|R_MOD|R_MENTOR|R_SERVER) & X.holder.rights)
if((R_ADMIN|R_MOD|R_EVENT|R_SERVER) & X.holder.rights)
if(X.is_afk())
admin_number_afk++
X << msg
if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
X << 'sound/effects/adminhelp.ogg'
if(X.holder.rights == R_MENTOR)
X << mentor_msg // Mentors won't see coloring of names on people with special_roles (Antags, etc.)
else
X << msg
//show it to the person adminhelping too
src << "<font color='blue'>PM to-<b>Staff </b>: [original_msg]</font>"
+1 -1
View File
@@ -112,7 +112,7 @@
//check client/X is an admin and isn't the sender or recipient
if(X == C || X == src)
continue
if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD|R_MENTOR))
if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD|R_EVENT))
X << "<span class='pm'><span class='other'>" + create_text_tag("pm_other", "PM:", X) + " <span class='name'>[key_name(src, X, 0)]</span> to <span class='name'>[key_name(C, X, 0)]</span>: <span class='message'>[msg]</span></span></span>"
/client/proc/cmd_admin_irc_pm(sender)
+2 -2
View File
@@ -23,7 +23,7 @@
set name = "Msay"
set hidden = 1
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR|R_SERVER))
if(!check_rights(R_ADMIN|R_MOD|R_SERVER))
return
msg = sanitize(msg)
@@ -45,7 +45,7 @@
set name = "Esay"
set hidden = 1
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR|R_SERVER))
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER))
return
msg = sanitize(msg)
+2 -2
View File
@@ -408,10 +408,10 @@
feedback_add_details("admin_verb","SEQ")
dressup_human(H, outfit, 1)
/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit, var/undress = 1)
/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit)
if(!H || !outfit)
return
if(undress)
if(outfit.undress)
H.delete_inventory()
outfit.equip(H)
log_and_message_admins("changed the equipment of [key_name(H)] to [outfit.name].")
+3 -3
View File
@@ -108,13 +108,13 @@
load_admins()
feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/reload_mentors()
set name = "Reload Mentors"
/client/proc/reload_eventMs()
set name = "Reload Event Managers"
set category = "Debug"
if(!check_rights(R_SERVER)) return
message_admins("[usr] manually reloaded Mentors")
message_admins("[usr] manually reloaded Event Managers")
world.load_mods()
+9 -9
View File
@@ -65,7 +65,7 @@
message_admins("<font color='blue'><B>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</B></font>", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_mentor_check_new_players() //Allows mentors / admins to determine who the newer players are.
/client/proc/cmd_eventM_check_new_players() //Allows event managers / admins to determine who the newer players are.
set category = "Admin"
set name = "Check new Players"
if(!holder)
@@ -82,7 +82,7 @@
var/msg = ""
var/highlight_special_characters = 1
if(is_mentor(usr.client))
if(is_eventM(usr.client))
highlight_special_characters = 0
for(var/client/C in clients)
@@ -610,7 +610,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Explosion"
if(!check_rights(R_DEBUG|R_FUN)) return
if(!check_rights(R_DEBUG|R_FUN|R_EVENT)) return
var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null
if(devastation == null) return
@@ -638,7 +638,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "EM Pulse"
if(!check_rights(R_DEBUG|R_FUN)) return
if(!check_rights(R_DEBUG|R_FUN|R_EVENT)) return
var/heavy = input("Range of heavy pulse.", text("Input")) as num|null
if(heavy == null) return
@@ -664,7 +664,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Gib"
if(!check_rights(R_ADMIN|R_FUN)) return
if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes") return
@@ -820,7 +820,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if ((!( ticker ) || !emergency_shuttle.location()))
return
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_ADMIN|R_EVENT)) return
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes") return
@@ -849,7 +849,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Admin"
set name = "Cancel Shuttle"
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_ADMIN|R_EVENT)) return
if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") return
@@ -870,7 +870,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if (!ticker)
return
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_ADMIN|R_EVENT)) return
emergency_shuttle.deny_shuttle = !emergency_shuttle.deny_shuttle
@@ -926,7 +926,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Toggle random events on/off"
set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off"
if(!check_rights(R_SERVER)) return
if(!check_rights(R_SERVER|R_EVENT)) return
if(!config.allow_random_events)
config.allow_random_events = 1
+1
View File
@@ -548,6 +548,7 @@
var/blood_overlay_type = "suit"
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
preserve_item = 1
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/suit.dmi',
+1
View File
@@ -7,6 +7,7 @@
force = 3
overshoes = 1
shoes_under_pants = -1 //These things are huge
preserve_item = 1
var/magpulse = 0
var/icon_base = "magboots"
action_button_name = "Toggle Magboots"
@@ -24,6 +24,7 @@
siemens_coefficient = 0.2
permeability_coefficient = 0.1
unacidable = 1
preserve_item = 1
var/interface_path = "hardsuit.tmpl"
var/ai_interface_path = "hardsuit.tmpl"
@@ -15,6 +15,7 @@
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona")
preserve_item = 1
var/obj/machinery/camera/camera
var/list/camera_networks
@@ -59,6 +60,7 @@
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona")
preserve_item = 1
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
+19 -1
View File
@@ -18,4 +18,22 @@
w_class = ITEMSIZE_NORMAL
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
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)
siemens_coefficient = 0.6
siemens_coefficient = 0.6
/obj/item/clothing/head/helmet/space/void/merc/fire
icon_state = "rig0-firebug"
name = "soot-covered voidsuit helmet"
desc = "A blackened helmet that has had many of its protective plates coated in or replaced with high-grade thermal insulation, to protect against incineration. Property of Gorlex Marauders."
armor = list(melee = 40, bullet = 40, laser = 60, energy = 20, bomb = 50, bio = 100, rad = 50)
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.7
light_overlay = "helmet_light_fire"
/obj/item/clothing/suit/space/void/merc/fire
icon_state = "rig-firebug"
name = "soot-covered voidsuit"
desc = "A blackened suit that has had many of its protective plates coated in or replaced with high-grade thermal insulation, to protect against incineration. Property of Gorlex Marauders."
armor = list(melee = 40, bullet = 40, laser = 60, energy = 20, bomb = 50, bio = 100, rad = 50)
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
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,/obj/item/weapon/material/twohanded/fireaxe,/obj/item/weapon/flamethrower)
siemens_coefficient = 0.7
+1 -1
View File
@@ -310,7 +310,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!client)
return
var/mentor = is_mentor(usr.client)
var/mentor = is_eventM(usr.client)
if(!config.antag_hud_allowed && (!client.holder || mentor))
src << "<font color='red'>Admins have disabled this for this round.</font>"
return
@@ -174,9 +174,11 @@
if ("clap")
if (!src.restrained())
message = "claps."
playsound(src.loc, 'sound/misc/clapping.ogg')
m_type = 2
if(miming)
m_type = 1
if ("flap")
if (!src.restrained())
message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings."
@@ -700,6 +702,20 @@
vomit()
return
if("whistle" || "whistles")
if(!muzzled)
message = "whistles a tune."
playsound(loc, 'sound/misc/longwhistle.ogg') //praying this doesn't get abused
else
message = "makes a light spitting noise, a poor attempt at a whistle."
if("qwhistle")
if(!muzzled)
message = "whistles quietly."
playsound(loc, 'sound/misc/shortwhistle.ogg')
else
message = "makes a light spitting noise, a poor attempt at a whistle."
if ("help")
src << "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \
frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, \
@@ -1241,7 +1241,7 @@
W.message = message
W.add_fingerprint(src)
/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone)
/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone, var/ignore_thickness = FALSE)
. = 1
if(!target_zone)
@@ -1261,10 +1261,10 @@
else
switch(target_zone)
if(BP_HEAD)
if(head && head.item_flags & THICKMATERIAL)
if(head && (head.item_flags & THICKMATERIAL) && !ignore_thickness)
. = 0
else
if(wear_suit && wear_suit.item_flags & THICKMATERIAL)
if(wear_suit && (wear_suit.item_flags & THICKMATERIAL) && !ignore_thickness)
. = 0
if(!. && error_msg && user)
if(!fail_msg)
@@ -26,12 +26,13 @@
)
var/id
// All syndie modules get these, and the base borg items (flash, crowbar, etc).
/obj/item/weapon/robot_module/robot/syndicate/New(var/mob/living/silicon/robot/R)
..()
loc = R
src.modules += new /obj/item/weapon/pinpointer/shuttle/merc(src)
src.modules += new /obj/item/weapon/melee/energy/sword(src)
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src)
src.modules += new /obj/item/weapon/card/emag(src)
var/jetpack = new/obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += jetpack
R.internals = jetpack
@@ -43,3 +44,141 @@
src.modules -= id
id = null
return ..()
// Gets a big shield and a gun that shoots really fast to scare the opposing force.
/obj/item/weapon/robot_module/robot/syndicate/protector
name = "protector robot module"
sprites = list(
"Cerberus - Treaded" = "syndie_treadhound",
"Cerberus" = "syndie_bloodhound",
"Ares" = "squats",
"XI-ALP" = "syndi-heavy"
)
/obj/item/weapon/robot_module/robot/syndicate/protector/New(var/mob/living/silicon/robot/R)
..()
src.modules += new /obj/item/shield_projector/rectangle/weak(src)
src.modules += new /obj/item/weapon/gun/energy/dakkalaser(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/robot(src)
// 95% engi-borg and 15% roboticist.
/obj/item/weapon/robot_module/robot/syndicate/mechanist
name = "mechanist robot module"
sprites = list(
"XI-GUS" = "spidersyndi",
"WTOperator" = "sleekhos"
)
/obj/item/weapon/robot_module/robot/syndicate/mechanist/New(var/mob/living/silicon/robot/R)
..()
// General engineering/hacking.
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/wrench/cyborg(src)
src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool/ai_detector(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/weapon/rcd/borg/lesser(src) // Can't eat rwalls to prevent AI core cheese.
src.modules += new /obj/item/weapon/melee/energy/sword/ionic_rapier(src)
// FBP repair.
src.modules += new /obj/item/device/robotanalyzer(src)
src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src)
src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src)
// Hacking other things.
src.modules += new /obj/item/weapon/card/robot(src)
src.modules += new /obj/item/weapon/card/emag(src)
// Materials.
var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000)
synths += nanite
var/datum/matter_synth/wire = new /datum/matter_synth/wire()
synths += wire
var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000)
synths += metal
var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000)
synths += glass
var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src)
N.uses_charge = 1
N.charge_costs = list(1000)
N.synths = list(nanite)
src.modules += N
var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
var/obj/item/stack/material/cyborg/glass/G = new (src)
G.synths = list(glass)
src.modules += G
var/obj/item/stack/rods/cyborg/rods = new /obj/item/stack/rods/cyborg(src)
rods.synths = list(metal)
src.modules += rods
var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src)
C.synths = list(wire)
src.modules += C
var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
// Mediborg optimized for on-the-field healing, but can also do surgery if needed.
/obj/item/weapon/robot_module/robot/syndicate/combat_medic
name = "combat medic robot module"
sprites = list(
"Telemachus" = "toiletbotantag"
)
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/New(var/mob/living/silicon/robot/R)
..()
src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
// Surgery things.
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src)
src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src)
src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src)
src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src)
src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src)
src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
// General healing.
src.modules += new /obj/item/weapon/gripper/medical(src)
src.modules += new /obj/item/weapon/shockpaddles/robot/combat(src)
src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows borg to fix necrosis apparently
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/roller_holder(src)
// Materials.
var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000)
synths += medicine
var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src)
var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src)
var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src)
O.uses_charge = 1
O.charge_costs = list(1000)
O.synths = list(medicine)
B.uses_charge = 1
B.charge_costs = list(1000)
B.synths = list(medicine)
S.uses_charge = 1
S.charge_costs = list(1000)
S.synths = list(medicine)
src.modules += O
src.modules += B
src.modules += S
@@ -6,6 +6,7 @@
lawchannel = "State"
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id
icon_selected = FALSE
/mob/living/silicon/robot/gravekeeper/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
@@ -6,6 +6,7 @@
lawchannel = "State"
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id
icon_selected = FALSE
/mob/living/silicon/robot/lost/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
@@ -0,0 +1,46 @@
/mob/living/silicon/robot/syndicate
lawupdate = 0
scrambledcodes = 1
icon_state = "syndie_bloodhound"
modtype = "Syndicate"
lawchannel = "State"
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id/syndicate
icon_selected = FALSE
/mob/living/silicon/robot/syndicate/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
mmi = new /obj/item/device/mmi/digital/robot(src) // Explicitly a drone.
overlays.Cut()
init_id()
updatename("Syndicate")
if(!cell)
cell = new /obj/item/weapon/cell/high(src) // 15k cell, because Antag.
laws = new /datum/ai_laws/syndicate_override()
radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio)
radio.recalculateChannels()
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/protector/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/protector(src)
updatename("Protector")
/mob/living/silicon/robot/syndicate/mechanist/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/mechanist(src)
updatename("Mechanist")
/mob/living/silicon/robot/syndicate/combat_medic/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/combat_medic(src)
updatename("Combat Medic")
/mob/living/silicon/robot/syndicate/speech_bubble_appearance()
return "synthetic_evil"
@@ -66,6 +66,19 @@
projectiletype = /obj/item/projectile/energy/neurotoxin/toxic
projectilesound = 'sound/weapons/pierce.ogg'
/mob/living/simple_animal/hostile/alien/sentinel/praetorian
name = "alien praetorian"
icon = 'icons/mob/64x64.dmi'
icon_state = "prat_s"
icon_living = "prat_s"
icon_dead = "prat_dead"
move_to_delay = 5
maxHealth = 200
health = 200
pixel_x = -16
old_x = -16
meat_amount = 5
/mob/living/simple_animal/hostile/alien/queen
name = "alien queen"
@@ -83,15 +96,36 @@
rapid = 1
status_flags = 0
/mob/living/simple_animal/hostile/alien/queen/large
/mob/living/simple_animal/hostile/alien/queen/empress
name = "alien empress"
icon = 'icons/mob/alienqueen.dmi'
icon = 'icons/mob/64x64.dmi'
icon_state = "queen_s"
icon_living = "queen_s"
icon_dead = "queen_dead"
move_to_delay = 4
maxHealth = 400
health = 400
meat_amount = 5
speed = 1
pixel_x = -16
old_x = -16
/mob/living/simple_animal/hostile/alien/queen/empress/mother
name = "alien mother"
icon = 'icons/mob/96x96.dmi'
icon_state = "empress_s"
icon_living = "empress_s"
icon_dead = "empress_dead"
maxHealth = 600
health = 600
meat_amount = 10
melee_damage_lower = 15
melee_damage_upper = 25
speed = 2
pixel_x = -32
old_x = -32
/mob/living/simple_animal/hostile/alien/death()
..()
@@ -36,6 +36,43 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
/mob/living/simple_animal/hostile/carp/large
name = "elder carp"
desc = "An older, more matured carp. Few survive to this age due to their aggressiveness."
icon = 'icons/mob/64x32.dmi'
icon_state = "shark"
icon_living = "shark"
icon_dead = "shark_dead"
turns_per_move = 2
move_to_delay = 2
mob_size = MOB_LARGE
pixel_x = -16
old_x = -16
health = 50
maxHealth = 50
/mob/living/simple_animal/hostile/carp/large/huge
name = "great white carp"
desc = "A very rare breed of carp- and a very aggressive one."
icon = 'icons/mob/64x64.dmi'
icon_dead = "megacarp_dead"
icon_living = "megacarp"
icon_state = "megacarp"
maxHealth = 230
health = 230
attack_same = 1
speed = 1
meat_amount = 10
melee_damage_lower = 15
melee_damage_upper = 25
old_y = -16
pixel_y = -16
/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/check_drift = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
@@ -50,4 +87,5 @@
if(istype(L))
if(prob(15))
L.Weaken(3)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
@@ -74,6 +74,27 @@
var/atom/cocoon_target
var/egg_inject_chance = 5
/mob/living/simple_animal/hostile/giant_spider/nurse/queen
desc = "Absolutely gigantic, this creature is horror itself."
icon = 'icons/mob/64x64.dmi'
icon_state = "spider_queen"
icon_living = "spider_queen"
icon_dead = "spider_queen_dead"
maxHealth = 320
health = 320
melee_damage_lower = 15
melee_damage_upper = 25
poison_per_bite = 10
egg_inject_chance = 10
pixel_x = -16
pixel_y = -16
old_x = -16
old_y = -16
//hunters have the most poison and move the fastest, so they can find prey
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
+1 -1
View File
@@ -400,7 +400,7 @@ proc/is_blind(A)
return // Can't talk in deadchat if you can't see it.
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_eventM(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
if(M.forbid_seeing_deadchat && !M.client.holder)
@@ -25,9 +25,9 @@
thing.reagents.remove_reagent(R.id, R.volume)
user.put_in_hands(F)
else if(istype(thing, /obj/machinery/power/supermatter/shard))
else if(istype(thing, /obj/machinery/power/supermatter))
var/obj/item/weapon/fuel_assembly/F = new(get_turf(src), "supermatter")
visible_message("<span class='notice'>\The [src] compresses the \[thing] into a new fuel assembly.</span>")
visible_message("<span class='notice'>\The [src] compresses \the [thing] into a new fuel assembly.</span>")
qdel(thing)
user.put_in_hands(F)
return 1
+2
View File
@@ -7,6 +7,7 @@
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 1
w_class = ITEMSIZE_TINY
preserve_item = 1
var/leaves_residue = 1
var/caliber = "" //Which kind of guns it can be loaded into
@@ -75,6 +76,7 @@
w_class = ITEMSIZE_SMALL
throw_speed = 4
throw_range = 10
preserve_item = 1
var/list/stored_ammo = list()
var/mag_type = SPEEDLOADER //ammo_magazines can only be used with compatible guns. This is not a bitflag, the load_method var on guns is.
@@ -7,6 +7,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 1800)
origin_tech = list(TECH_COMBAT = 1)
var/remaining = 9
preserve_item = 1
/obj/item/weapon/magnetic_ammo/examine(mob/user)
. = ..()
+1
View File
@@ -46,6 +46,7 @@
throw_speed = 4
throw_range = 5
force = 5
preserve_item = 1
origin_tech = list(TECH_COMBAT = 1)
attack_verb = list("struck", "hit", "bashed")
zoomdevicename = "scope"
@@ -177,4 +177,24 @@ obj/item/weapon/gun/energy/staff/focus
charge_cost = 200
user << "<span class='warning'>The [src.name] will now strike only a single person.</span>"
projectile_type = "/obj/item/projectile/forcebolt"
*/
*/
/obj/item/weapon/gun/energy/dakkalaser
name = "suppression gun"
desc = "A massive weapon, designed to pressure the opposition by raining down a torrent of energy pellets."
icon_state = "dakkalaser"
item_state = "dakkalaser"
fire_sound = 'sound/weapons/Laser.ogg'
w_class = ITEMSIZE_HUGE
charge_cost = 24 // 100 shots, it's a spray and pray (to RNGesus) weapon.
projectile_type = /obj/item/projectile/energy/blue_pellet
self_recharge = 1
accuracy = 5 // Suppressive weapons don't work too well if there's no risk of being hit.
burst_delay = 1 // Burst faster than average.
origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 6, TECH_ILLEGAL = 6)
firemodes = list(
list(mode_name="single shot", burst = 1, burst_accuracy = list(5), dispersion = list(0), charge_cost = 24),
list(mode_name="five shot burst", burst = 5, burst_accuracy = list(5,5,5,5,5), dispersion = list(1,1,1,1,1)),
list(mode_name="ten shot burst", burst = 10, burst_accuracy = list(5,5,5,5,5,5,5,5,5,5), dispersion = list(2,2,2,2,2,2,2,2,2,2)),
)
@@ -4,7 +4,7 @@
icon_state = "coilgun"
item_state = "coilgun"
icon = 'icons/obj/railgun.dmi'
// one_hand_penalty = 1
// one_handed_penalty = 1
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_MAGNET = 4)
w_class = ITEMSIZE_LARGE
@@ -193,3 +193,66 @@
qdel(src)
return new projectile_type(src)
/obj/item/weapon/gun/magnetic/fuelrod
name = "Fuel-Rod Cannon"
desc = "A bulky weapon designed to fire reactor core fuel rods at absurd velocities... who thought this was a good idea?!"
description_antag = "This device is capable of firing reactor fuel assemblies, acquired from a R-UST fuel compressor and an appropriate fueltype. Be warned, Supermatter rods may have unforseen consequences."
description_fluff = "Morpheus' second entry into the arms manufacturing field, the Morpheus B.F.G, or 'Big Fuel-rod Gun' made some noise when it was initially sent to the market. By noise, they mean it was rapidly declared 'incredibly dangerous to the wielder and civilians within a mile radius alike'."
icon_state = "fuelrodgun"
item_state = "coilgun"
icon = 'icons/obj/railgun.dmi'
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_PHORON = 4, TECH_ILLEGAL = 5, TECH_MAGNET = 4)
w_class = ITEMSIZE_LARGE
removable_components = TRUE
gun_unreliable = 0
load_type = /obj/item/weapon/fuel_assembly
projectile_type = /obj/item/projectile/bullet/magnetic/fuelrod
power_cost = 500
/obj/item/weapon/gun/magnetic/fuelrod/consume_next_projectile()
if(!check_ammo() || !capacitor || capacitor.charge < power_cost)
return
if(loaded) //Safety.
if(istype(loaded, /obj/item/weapon/fuel_assembly))
var/obj/item/weapon/fuel_assembly/rod = loaded
if(rod.fuel_type == "composite" || rod.fuel_type == "deuterium") //Safety check for rods spawned in without a fueltype.
projectile_type = /obj/item/projectile/bullet/magnetic/fuelrod
else if(rod.fuel_type == "tritium")
projectile_type = /obj/item/projectile/bullet/magnetic/fuelrod/tritium
else if(rod.fuel_type == "phoron")
projectile_type = /obj/item/projectile/bullet/magnetic/fuelrod/phoron
else if(rod.fuel_type == "supermatter")
projectile_type = /obj/item/projectile/bullet/magnetic/fuelrod/supermatter
visible_message("<span class='danger'>The barrel of \the [src] glows a blinding white!</span>")
spawn(5)
visible_message("<span class='danger'>\The [src] begins to rattle, its acceleration chamber collapsing in on itself!</span>")
removable_components = FALSE
spawn(15)
audible_message("<span class='critical'>\The [src]'s power supply begins to overload as the device crumples!</span>") //Why are you still holding this?
playsound(loc, 'sound/effects/grillehit.ogg', 10, 1)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
var/turf/T = get_turf(src)
sparks.set_up(2, 1, T)
sparks.start()
spawn(15)
visible_message("<span class='critical'>\The [src] explodes in a blinding white light!</span>")
explosion(src.loc, -1, 1, 2, 3)
qdel(src)
else
projectile_type = /obj/item/projectile/bullet/magnetic/fuelrod
use_ammo()
capacitor.use(power_cost)
update_icon()
return new projectile_type(src)
/obj/item/weapon/gun/magnetic/fuelrod/New()
cell = new /obj/item/weapon/cell/high
capacitor = new /obj/item/weapon/stock_parts/capacitor
. = ..()
@@ -67,9 +67,9 @@
w_class = ITEMSIZE_NO_CONTAINER
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_hand_penalty=1, burst_accuracy=null, dispersion=null),
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_hand_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
list(mode_name="long bursts", burst=6, fire_delay=null, move_delay=10, one_hand_penalty=2, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(0.6, 0.6, 1.0, 1.0, 1.2)),
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=1, burst_accuracy=null, dispersion=null),
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
list(mode_name="long bursts", burst=6, fire_delay=null, move_delay=10, one_handed_penalty=2, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(0.6, 0.6, 1.0, 1.0, 1.2)),
)
/obj/item/weapon/gun/magnetic/railgun/automatic/examine(var/mob/user)
@@ -94,8 +94,8 @@
fire_sound = 'sound/weapons/rapidslice.ogg'
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_hand_penalty=1, burst_accuracy=null, dispersion=null),
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_hand_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=1, burst_accuracy=null, dispersion=null),
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
)
/obj/item/weapon/gun/magnetic/railgun/flechette/out_of_ammo()
+5 -3
View File
@@ -333,9 +333,11 @@
else if(!bumped)
tracer_effect(effect_transform)
if(incendiary >= 2)
var/trail_volume = (flammability * 0.10)
new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(src.loc, trail_volume, src.dir)
if(incendiary >= 2) //This should cover the bases of 'Why is there fuel here?' in a much cleaner way than previous.
if(src && src.loc) //Safety.
if(!src.loc.density)
var/trail_volume = (flammability * 0.20)
new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(src.loc, trail_volume, src.dir)
if(!hitscan)
sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon
@@ -272,6 +272,7 @@
flammability = 4
agony = 30
kill_count = 4
vacuum_traversal = 0
/obj/item/projectile/bullet/incendiary/flamethrower/large
damage = 15
+14 -1
View File
@@ -182,4 +182,17 @@
/obj/item/projectile/energy/plasmastun/on_hit(var/atom/target)
bang(target)
. = ..()
. = ..()
/obj/item/projectile/energy/blue_pellet
name = "suppressive pellet"
icon_state = "blue_pellet"
damage = 5
armor_penetration = 75
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage_type = BURN
check_armour = "energy"
light_color = "#0000FF"
embed_chance = 0
muzzle_type = /obj/effect/projectile/pulse/muzzle
@@ -18,4 +18,100 @@
name = "flechette"
icon_state = "flechette"
damage = 20
armor_penetration = 100
armor_penetration = 100
/obj/item/projectile/bullet/magnetic/fuelrod
name = "fuel rod"
icon_state = "fuel-deuterium"
damage = 30
stun = 1
weaken = 0
agony = 30
incendiary = 1
flammability = 0 //Deuterium and Tritium are both held in water, but the object moving so quickly will ignite the target.
penetrating = 2
embed_chance = 0
armor_penetration = 40
kill_count = 20
var/searing = 0 //Does this fuelrod ignore shields?
var/detonate_travel = 0 //Will this fuelrod explode when it reaches maximum distance?
var/detonate_mob = 0 //Will this fuelrod explode when it hits a mob?
var/energetic_impact = 0 //Does this fuelrod cause a bright flash on impact with a mob?
/obj/item/projectile/bullet/magnetic/fuelrod/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) //Future-proofing. Special effects for impact.
if(istype(target,/mob/living))
var/mob/living/V = target
if(detonate_mob)
if(V.loc)
explosion(V.loc, -1, -1, 2, 3)
if(energetic_impact)
var/eye_coverage = 0
for(var/mob/living/carbon/M in viewers(world.view, location))
eye_coverage = 0
if(iscarbon(M))
eye_coverage = M.eyecheck()
if(eye_coverage < 2)
M.flash_eyes()
M.Stun(2)
M.Weaken(10)
if(searing)
if(blocked)
blocked = 0
return ..(target, blocked, def_zone)
/obj/item/projectile/bullet/magnetic/fuelrod/on_impact(var/atom/A) //Future-proofing, again. In the event new fuel rods are introduced, and have special effects for when they stop flying.
if(src.loc)
if(detonate_travel && detonate_mob)
visible_message("<span class='warning'>\The [src] shatters in a violent explosion!</span>")
explosion(src.loc, 1, 1, 3, 4)
else if(detonate_travel)
visible_message("<span class='warning'>\The [src] explodes in a shower of embers!</span>")
explosion(src.loc, -1, 1, 2, 3)
..(A)
/obj/item/projectile/bullet/magnetic/fuelrod/tritium
icon_state = "fuel-tritium"
damage = 40
flammability = -1
armor_penetration = 50
penetrating = 3
/obj/item/projectile/bullet/magnetic/fuelrod/phoron
name = "blazing fuel rod"
icon_state = "fuel-phoron"
damage = 35
incendiary = 2
flammability = 2
armor_penetration = 60
penetrating = 5
irradiate = 20
detonate_mob = 1
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter
name = "painfully incandescent fuel rod"
icon_state = "fuel-supermatter"
damage = 15
incendiary = 2
flammability = 4
weaken = 2
armor_penetration = 100
penetrating = 100 //Theoretically, this shouldn't stop flying for a while, unless someone lines it up with a wall or fires it into a mountain.
irradiate = 120
kill_count = 75
searing = 1
detonate_travel = 1
detonate_mob = 1
energetic_impact = 1
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) //You cannot touch the supermatter without disentigrating. Assumedly, this is true for condensed rods of it flying at relativistic speeds.
if(istype(target,/turf/simulated/wall) || istype(target,/mob/living))
target.visible_message("<span class='danger'>The [src] burns a perfect hole through \the [target] with a blinding flash!</span>")
playsound(target.loc, 'sound/effects/teleport.ogg', 40, 0)
return ..(target, blocked, def_zone)
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter/check_penetrate()
return 1
@@ -691,4 +691,21 @@
else
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
data = world.time
to_chat(M, "<span class='notice'>You feel invigorated and calm.</span>")
to_chat(M, "<span class='notice'>You feel invigorated and calm.</span>")
// This exists to cut the number of chemicals a merc borg has to juggle on their hypo.
/datum/reagent/healing_nanites
name = "Restorative Nanites"
id = "healing_nanites"
description = "Miniature medical robots that swiftly restore bodily damage."
taste_description = "metal"
reagent_state = SOLID
color = "#555555"
metabolism = REM * 4 // Nanomachines gotta go fast.
scannable = 1
/datum/reagent/healing_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.heal_organ_damage(2 * removed, 2 * removed)
M.adjustOxyLoss(-4 * removed)
M.adjustToxLoss(-2 * removed)
M.adjustCloneLoss(-2 * removed)
@@ -12,6 +12,7 @@
var/charge_cost = 50
var/charge_tick = 0
var/recharge_time = 5 //Time it takes for shots to recharge (in seconds)
var/bypass_protection = FALSE // If true, can inject through things like spacesuits and armor.
var/list/reagent_ids = list("tricordrazine", "inaprovaline", "anti_toxin", "tramadol", "dexalin" ,"spaceacillin")
var/list/reagent_volumes = list()
@@ -26,6 +27,13 @@
/obj/item/weapon/reagent_containers/borghypo/lost
reagent_ids = list("tricordrazine", "bicaridine", "dexalin", "anti_toxin", "tramadol", "spaceacillin")
/obj/item/weapon/reagent_containers/borghypo/merc
name = "advanced cyborg hypospray"
desc = "An advanced nanite and chemical synthesizer and injection system, designed for heavy-duty medical equipment. This type is capable of safely bypassing \
thick materials that other hyposprays would struggle with."
bypass_protection = TRUE // Because mercs tend to be in spacesuits.
reagent_ids = list("healing_nanites", "hyperzine", "tramadol", "oxycodone", "spaceacillin", "peridaxon", "osteodaxon", "myelamine")
/obj/item/weapon/reagent_containers/borghypo/New()
..()
@@ -72,7 +80,7 @@
user << "<span class='danger'>You cannot inject a robotic limb.</span>"
return
if (M.can_inject(user, 1))
if(M.can_inject(user, 1, ignore_thickness = bypass_protection))
user << "<span class='notice'>You inject [M] with the injector.</span>"
M << "<span class='notice'>You feel a tiny prick!</span>"
@@ -157,8 +157,7 @@
user << "<span class='notice'>You splash the solution onto [target].</span>"
reagents.splash(target, reagents.total_volume)
return 1
else
return
..()
/obj/item/weapon/reagent_containers/food/drinks/glass2/standard_feed_mob(var/mob/user, var/mob/target)
if(afterattack(target, user)) //Check to see if harm intent & splash.
@@ -14,6 +14,7 @@
possible_transfer_amounts = null
flags = OPENCONTAINER
slot_flags = SLOT_BELT
preserve_item = 1
var/reusable = 1
var/used = 0
var/filled = 0
@@ -70,6 +71,7 @@
reusable = 0
filled = 1
filled_reagents = list("inaprovaline" = 5)
preserve_item = 0
/obj/item/weapon/reagent_containers/hypospray/autoinjector/on_reagent_change()
..()
+7
View File
@@ -639,6 +639,13 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/ammo_casing/chemdart
sort_string = "TACAF"
/datum/design/item/weapon/fuelrod
id = "fuelrod_gun"
req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_PHORON = 4, TECH_ILLEGAL = 5, TECH_MAGNET = 5)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "gold" = 500, "silver" = 500, "uranium" = 1000, "phoron" = 3000, "diamond" = 1000)
build_path = /obj/item/weapon/gun/magnetic/fuelrod
sort_string = "TACBA"
/datum/design/item/weapon/flora_gun
id = "flora_gun"
req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)