Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-27595
This commit is contained in:
@@ -37,7 +37,7 @@
|
||||
body += " \[<A href='?_src_=holder;revive=\ref[M]'>Heal</A>\] "
|
||||
|
||||
if(M.client)
|
||||
body += "<br>\[<b>Player Age:</b> [M.client.player_age]\]\[<b>Byond Age:</b> [M.client.account_age]\]"
|
||||
body += "<br>\[<b>First Seen:</b> [M.client.player_join_date]\]\[<b>Byond account registered on:</b> [M.client.account_join_date]\]"
|
||||
body += "<br><b>Show related accounts by:</b> "
|
||||
body += "\[ <a href='?_src_=holder;showrelatedacc=cid;client=\ref[M.client]'>CID</a> | "
|
||||
body += "<a href='?_src_=holder;showrelatedacc=ip;client=\ref[M.client]'>IP</a> \]"
|
||||
@@ -48,7 +48,7 @@
|
||||
body += "<a href='?priv_msg=[M.ckey]'>PM</a> - "
|
||||
body += "<a href='?_src_=holder;subtlemessage=\ref[M]'>SM</a> - "
|
||||
body += "<a href='?_src_=holder;adminplayerobservefollow=\ref[M]'>FLW</a> - "
|
||||
body += "<a href='?_src_=holder;individuallog=\ref[M]'>LOGS</a>\] <b><br>"
|
||||
body += "<a href='?_src_=holder;individuallog=\ref[M]'>LOGS</a>\] <br>"
|
||||
|
||||
body += "<b>Mob type</b> = [M.type]<br><br>"
|
||||
|
||||
@@ -239,21 +239,21 @@
|
||||
if(6)
|
||||
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed story to Network.</B></FONT><HR><BR>"
|
||||
if(src.admincaster_feed_channel.channel_name=="")
|
||||
dat+="<FONT COLOR='maroon'>Invalid receiving channel name.</FONT><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Invalid receiving channel name.</FONT><BR>"
|
||||
if(src.admincaster_feed_message.returnBody(-1) == "" || src.admincaster_feed_message.returnBody(-1) == "\[REDACTED\]")
|
||||
dat+="<FONT COLOR='maroon'>Invalid message body.</FONT><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Invalid message body.</FONT><BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[3]'>Return</A><BR>"
|
||||
if(7)
|
||||
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed Channel to Network.</B></FONT><HR><BR>"
|
||||
if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]")
|
||||
dat+="<FONT COLOR='maroon'>Invalid channel name.</FONT><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Invalid channel name.</FONT><BR>"
|
||||
var/check = 0
|
||||
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
|
||||
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
|
||||
check = 1
|
||||
break
|
||||
if(check)
|
||||
dat+="<FONT COLOR='maroon'>Channel name already in use.</FONT><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Channel name already in use.</FONT><BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[2]'>Return</A><BR>"
|
||||
if(9)
|
||||
dat+="<B>[admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[created by: <FONT COLOR='maroon'>[admincaster_feed_channel.returnAuthor(-1)]</FONT>\]</FONT><HR>"
|
||||
@@ -354,9 +354,9 @@
|
||||
if(16)
|
||||
dat+="<B><FONT COLOR='maroon'>ERROR: Wanted Issue rejected by Network.</B></FONT><HR><BR>"
|
||||
if(src.admincaster_wanted_message.criminal =="" || src.admincaster_wanted_message.criminal == "\[REDACTED\]")
|
||||
dat+="<FONT COLOR='maroon'>Invalid name for person wanted.</FONT><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Invalid name for person wanted.</FONT><BR>"
|
||||
if(src.admincaster_wanted_message.body == "" || src.admincaster_wanted_message.body == "\[REDACTED\]")
|
||||
dat+="<FONT COLOR='maroon'>Invalid description.</FONT><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Invalid description.</FONT><BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
|
||||
if(17)
|
||||
dat+="<B>Wanted Issue successfully deleted from Circulation</B><BR>"
|
||||
@@ -419,18 +419,18 @@
|
||||
set desc="Restarts the world immediately"
|
||||
if (!usr.client.holder)
|
||||
return
|
||||
|
||||
var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
|
||||
var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
|
||||
if(result)
|
||||
|
||||
var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
|
||||
var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
|
||||
if(result)
|
||||
SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
switch(result)
|
||||
if("Regular Restart")
|
||||
SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
|
||||
if("Hard Restart (No Delay, No Feeback Reason)")
|
||||
world.Reboot()
|
||||
if("Hardest Restart (No actions, just reboot)")
|
||||
world.Reboot(fast_track = TRUE)
|
||||
switch(result)
|
||||
if("Regular Restart")
|
||||
SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
|
||||
if("Hard Restart (No Delay, No Feeback Reason)")
|
||||
world.Reboot()
|
||||
if("Hardest Restart (No actions, just reboot)")
|
||||
world.Reboot(fast_track = TRUE)
|
||||
|
||||
/datum/admins/proc/end_round()
|
||||
set category = "Server"
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
if("list_bombers")
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/dat = "<B>Bombing List<HR>"
|
||||
var/dat = "<B>Bombing List</B><HR>"
|
||||
for(var/l in GLOB.bombers)
|
||||
dat += text("[l]<BR>")
|
||||
usr << browse(dat, "window=bombers")
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
//Syndicate sub-machine guns.
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r/Initialize()
|
||||
. = ..()
|
||||
for(var/ammo in magazine.stored_ammo)
|
||||
if(prob(95)) //95% chance
|
||||
magazine.stored_ammo -= ammo
|
||||
@@ -55,8 +55,8 @@
|
||||
//Barman's shotgun
|
||||
/obj/item/weapon/gun/ballistic/shotgun/sc_pump
|
||||
|
||||
/obj/item/weapon/gun/ballistic/shotgun/sc_pump/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/shotgun/sc_pump/Initialize()
|
||||
. = ..()
|
||||
for(var/ammo in magazine.stored_ammo)
|
||||
if(prob(95)) //95% chance
|
||||
magazine.stored_ammo -= ammo
|
||||
|
||||
@@ -1582,7 +1582,7 @@
|
||||
name = "Contraband Crate"
|
||||
contraband = TRUE
|
||||
cost = 3000
|
||||
num_contained = 6
|
||||
num_contained = 5
|
||||
contains = list(/obj/item/weapon/poster/random_contraband,
|
||||
/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims,
|
||||
/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori,
|
||||
|
||||
@@ -420,8 +420,8 @@
|
||||
var/badmin_mode = FALSE
|
||||
var/static/list/blacklisted_vars = list("locs", "loc", "contents", "x", "y", "z")
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/chameleon/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/energy/laser/chameleon/Initialize()
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/weapon/gun
|
||||
chameleon_action.chameleon_name = "Gun"
|
||||
|
||||
@@ -7,18 +7,18 @@
|
||||
actions_types = list(/datum/action/item_action/toggle_mode)
|
||||
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
|
||||
|
||||
mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode
|
||||
mesons_on = TRUE //if set to FALSE, these goggles work as t-ray scanners.
|
||||
var/range = 1
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && T.z == ZLEVEL_MINING && mode)
|
||||
if(T && T.z == ZLEVEL_MINING && !mesons_on)
|
||||
if(picked_excuse)
|
||||
to_chat(user, "<span class='warning'>Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.</span>")
|
||||
return
|
||||
mode = !mode
|
||||
mesons_on = !mesons_on
|
||||
|
||||
if(mode)
|
||||
if(!mesons_on)
|
||||
vision_flags = 0
|
||||
darkness_view = 2
|
||||
invis_view = SEE_INVISIBLE_LIVING
|
||||
@@ -50,7 +50,7 @@
|
||||
toggle_mode(user, TRUE)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/process()
|
||||
if(!mode)
|
||||
if(mesons_on)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && T.z == ZLEVEL_MINING)
|
||||
toggle_mode(loc)
|
||||
@@ -83,15 +83,8 @@
|
||||
if(M.client)
|
||||
flick_overlay(I, list(M.client), 8)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/proc/t_ray_on()
|
||||
if(!ishuman(loc))
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/user = loc
|
||||
return mode & (user.glasses == src)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/update_icon()
|
||||
icon_state = mode ? "trayson-tray" : "trayson-meson"
|
||||
icon_state = mesons_on ? "trayson-meson" : "trayson-tray"
|
||||
if(istype(loc,/mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/user = loc
|
||||
if(user.glasses == src)
|
||||
@@ -103,7 +96,7 @@
|
||||
icon_state = "trayson-tray_off"
|
||||
origin_tech = "materials=3;magnets=2;engineering=2"
|
||||
|
||||
mode = TRUE
|
||||
mesons_on = FALSE
|
||||
var/on = FALSE
|
||||
vision_flags = 0
|
||||
darkness_view = 2
|
||||
@@ -135,6 +128,3 @@
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/tray/t_ray_on()
|
||||
return on && ..()
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \
|
||||
"gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat")
|
||||
var/picked_excuse
|
||||
var/mode = FALSE //if FALSE, is in normal meson mode.
|
||||
var/mesons_on = TRUE
|
||||
|
||||
/obj/item/clothing/glasses/meson/Initialize()
|
||||
. = ..()
|
||||
@@ -56,34 +56,28 @@
|
||||
/obj/item/clothing/glasses/meson/examine(mob/user)
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && T.z == ZLEVEL_MINING && mode && picked_excuse)
|
||||
if(T && T.z == ZLEVEL_MINING && !mesons_on && picked_excuse)
|
||||
to_chat(user, "<span class='warning'>Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.</span>")
|
||||
|
||||
/obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user)
|
||||
if(vision_flags & SEE_TURFS)
|
||||
mode = TRUE
|
||||
vision_flags &= ~SEE_TURFS
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(picked_excuse)
|
||||
to_chat(H, "<span class='warning'>Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.</span>")
|
||||
if(H.glasses == src)
|
||||
H.update_sight()
|
||||
else if(!(vision_flags & SEE_TURFS))
|
||||
mode = FALSE
|
||||
vision_flags |= SEE_TURFS
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
to_chat(H, "<span class='notice'>Your Meson Scanners have reactivated.</span>")
|
||||
if(H.glasses == src)
|
||||
H.update_sight()
|
||||
vision_flags ^= SEE_TURFS
|
||||
mesons_on = (vision_flags & SEE_TURFS)? TRUE : FALSE
|
||||
|
||||
if(iscarbon(user)) //only carbons can wear glasses
|
||||
var/mob/living/carbon/C = user
|
||||
if(!mesons_on)
|
||||
to_chat(C, "<span class='notice'>Your Meson Scanners have reactivated.</span>")
|
||||
else if(picked_excuse)
|
||||
to_chat(C, "<span class='warning'>Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.</span>")
|
||||
if(C.glasses == src)
|
||||
C.update_sight()
|
||||
|
||||
/obj/item/clothing/glasses/meson/process()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && T.z == ZLEVEL_MINING)
|
||||
if(!mode)
|
||||
if(mesons_on) //if we're on mining, turn mesons OFF
|
||||
toggle_mode(loc)
|
||||
else if(mode)
|
||||
else if(!mesons_on) //otherwise, if we're not on mining, turn mesons back ON
|
||||
toggle_mode(loc)
|
||||
|
||||
/obj/item/clothing/glasses/meson/night
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/item/clothing/head/hunter
|
||||
name = "hunter hat"
|
||||
desc = "It's a flimsy looking hat."
|
||||
icon_state = "hunter"
|
||||
item_state = "hunter"
|
||||
icon_state = "hunter-worn"
|
||||
icon = 'icons/obj/clothing/cit_hats.dmi'
|
||||
@@ -50,12 +50,28 @@
|
||||
name = "captain's cloak"
|
||||
desc = "Worn by the commander of Space Station 13."
|
||||
icon_state = "capcloak"
|
||||
|
||||
|
||||
/obj/item/clothing/neck/cloak/hop
|
||||
name = "head of personnel's cloak"
|
||||
desc = "Worn by the Head of Personnel. It smells faintly of bureaucracy."
|
||||
icon_state = "hopcloak"
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/goliath
|
||||
name = "goliath cloak"
|
||||
icon_state = "goliath_cloak"
|
||||
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear, /obj/item/weapon/twohanded/bonespear, /obj/item/organ/hivelord_core/legion, /obj/item/weapon/kitchen/knife/combat/bone, /obj/item/weapon/kitchen/knife/combat/survival)
|
||||
armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
|
||||
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/head/hooded/cloakhood/goliath
|
||||
name = "goliath cloak hood"
|
||||
icon_state = "golhood"
|
||||
desc = "A protective & concealing hood."
|
||||
armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60)
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/drake
|
||||
name = "drake armour"
|
||||
icon_state = "dragon"
|
||||
|
||||
@@ -541,5 +541,5 @@
|
||||
name = "spooky ghost"
|
||||
desc = "this is obviously just a bedsheet, but maybe try it on?"
|
||||
icon_state = "bedsheet"
|
||||
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = 1, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
|
||||
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
|
||||
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
|
||||
|
||||
@@ -337,9 +337,9 @@
|
||||
/obj/item/weapon/restraints/handcuffs/cable = 1
|
||||
)
|
||||
category = CAT_MISC
|
||||
|
||||
|
||||
/datum/crafting_recipe/toysword
|
||||
name = "Toy Sword"
|
||||
name = "Toy Sword"
|
||||
reqs = list(/obj/item/weapon/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
|
||||
result = /obj/item/toy/sword
|
||||
category = CAT_MISC
|
||||
@@ -398,6 +398,15 @@
|
||||
reqs = list(/obj/item/stack/sheet/bone = 4)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/goliathcloak
|
||||
name = "Goliath Cloak"
|
||||
result = /obj/item/clothing/suit/hooded/cloak/goliath
|
||||
time = 50
|
||||
reqs = list(/obj/item/stack/sheet/leather = 2,
|
||||
/obj/item/stack/sheet/sinew = 2,
|
||||
/obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/drakecloak
|
||||
name = "Ash Drake Armour"
|
||||
result = /obj/item/clothing/suit/hooded/cloak/drake
|
||||
|
||||
@@ -306,6 +306,5 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom/attack_self(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
message_admins("Shadowshroom planted by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(user)]",0,1)
|
||||
investigate_log("was planted by [key_name(user)] at [COORD(user)]", INVESTIGATE_BOTANY)
|
||||
|
||||
|
||||
@@ -107,7 +107,6 @@
|
||||
|
||||
/datum/language_holder/construct
|
||||
languages = list(/datum/language/common, /datum/language/narsie)
|
||||
only_speaks_language = /datum/language/narsie
|
||||
|
||||
/datum/language_holder/drone
|
||||
languages = list(/datum/language/common, /datum/language/drone, /datum/language/machine)
|
||||
|
||||
@@ -217,6 +217,7 @@
|
||||
/area/survivalpod
|
||||
name = "\improper Emergency Shelter"
|
||||
icon_state = "away"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = 0
|
||||
has_gravity = 1
|
||||
|
||||
@@ -394,7 +395,9 @@
|
||||
icon = 'icons/obj/lavaland/donkvendor.dmi'
|
||||
icon_on = "donkvendor"
|
||||
icon_off = "donkvendor"
|
||||
luminosity = 8
|
||||
light_range = 5
|
||||
light_power = 1.2
|
||||
light_color = "#DDFFD3"
|
||||
max_n_of_items = 10
|
||||
pixel_y = -4
|
||||
flags = NODECONSTRUCT
|
||||
|
||||
@@ -72,6 +72,9 @@
|
||||
if(!brainmob.stored_dna)
|
||||
brainmob.stored_dna = new /datum/dna/stored(brainmob)
|
||||
C.dna.copy_dna(brainmob.stored_dna)
|
||||
var/obj/item/organ/zombie_infection/ZI = L.getorganslot("zombie_infection")
|
||||
if(ZI)
|
||||
brainmob.set_species(ZI.old_species) //For if the brain is cloned
|
||||
if(L.mind && L.mind.current)
|
||||
L.mind.transfer_to(brainmob)
|
||||
to_chat(brainmob, "<span class='notice'>You feel slightly disoriented. That's normal when you're just a brain.</span>")
|
||||
|
||||
@@ -31,10 +31,8 @@
|
||||
|
||||
create_internal_organs()
|
||||
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/monkey/Initialize()
|
||||
..()
|
||||
create_dna(src)
|
||||
dna.initialize_dna(random_blood_type())
|
||||
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
|
||||
|
||||
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
|
||||
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
|
||||
var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas
|
||||
//and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt
|
||||
|
||||
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
|
||||
|
||||
@@ -833,8 +833,20 @@
|
||||
|
||||
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
|
||||
var/name_used = speaker.GetVoice()
|
||||
var/rendered = "<i><span class='game say'>Relayed Speech: <span class='name'>[name_used]</span> <span class='message'>[raw_message]</span></span></i>"
|
||||
var/start = "Relayed Speech: "
|
||||
var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]"
|
||||
var/hrefpart = "<a href='?src=\ref[src];track=[html_encode(namepart)]'>"
|
||||
var/jobpart
|
||||
|
||||
if (iscarbon(speaker))
|
||||
var/mob/living/carbon/S = speaker
|
||||
if(S.job)
|
||||
jobpart = "[S.job]"
|
||||
else
|
||||
jobpart = "Unknown"
|
||||
|
||||
var/rendered = "<i><span class='game say'>[start]<span class='name'>[hrefpart][namepart] ([jobpart])</a> </span><span class='message'>[raw_message]</span></span></i>"
|
||||
|
||||
show_message(rendered, 2)
|
||||
|
||||
/mob/living/silicon/ai/fully_replace_character_name(oldname,newname)
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
|
||||
//Medbot Assembly
|
||||
/obj/item/weapon/firstaid_arm_assembly
|
||||
name = "incomplete medibot assembly."
|
||||
name = "incomplete medibot assembly"
|
||||
desc = "A first aid kit with a robot arm permanently grafted to it."
|
||||
icon = 'icons/mob/aibots.dmi'
|
||||
icon_state = "firstaid_arm"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
environment_smash = initial(environment_smash)
|
||||
alpha = 255
|
||||
range = initial(range)
|
||||
incorporeal_move = 0
|
||||
incorporeal_move = FALSE
|
||||
to_chat(src, "<span class='danger'><B>You switch to combat mode.</span></B>")
|
||||
toggle = FALSE
|
||||
else
|
||||
@@ -48,7 +48,7 @@
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
alpha = 45
|
||||
range = 255
|
||||
incorporeal_move = 1
|
||||
incorporeal_move = INCORPOREAL_MOVE_BASIC
|
||||
to_chat(src, "<span class='danger'><B>You switch to scout mode.</span></B>")
|
||||
toggle = TRUE
|
||||
else
|
||||
|
||||
@@ -840,6 +840,9 @@
|
||||
health = 120
|
||||
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
|
||||
icon_state = "dwarf_legion"
|
||||
icon_living = "dwarf_legion"
|
||||
icon_aggro = "dwarf_legion"
|
||||
icon_dead = "dwarf_legion"
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
|
||||
stat_attack = 2
|
||||
@@ -859,6 +862,7 @@
|
||||
max_mobs = 3
|
||||
spawn_time = 200
|
||||
spawn_text = "peels itself off from"
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
anchored = FALSE
|
||||
@@ -1037,6 +1041,11 @@
|
||||
regenerate_icons()
|
||||
|
||||
//Nests
|
||||
/obj/effect/light_emitter/tendril
|
||||
set_luminosity = 4
|
||||
set_cap = 2.5
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland
|
||||
name = "necropolis tendril"
|
||||
desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it."
|
||||
@@ -1046,7 +1055,6 @@
|
||||
icon_dead = "tendril"
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
luminosity = 1
|
||||
health = 250
|
||||
maxHealth = 250
|
||||
max_mobs = 3
|
||||
@@ -1059,9 +1067,17 @@
|
||||
loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril)
|
||||
del_on_death = 1
|
||||
var/gps = null
|
||||
var/obj/effect/light_emitter/tendril/emitted_light
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/legion
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
emitted_light = new(loc)
|
||||
for(var/F in RANGE_TURFS(1, src))
|
||||
if(ismineralturf(F))
|
||||
var/turf/closed/mineral/M = F
|
||||
@@ -1069,7 +1085,8 @@
|
||||
gps = new /obj/item/device/gps/internal(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/Destroy()
|
||||
qdel(gps)
|
||||
QDEL_NULL(emitted_light)
|
||||
QDEL_NULL(gps)
|
||||
. = ..()
|
||||
|
||||
#define MEDAL_PREFIX "Tendril"
|
||||
@@ -1096,29 +1113,31 @@
|
||||
/obj/effect/collapse
|
||||
name = "collapsing necropolis tendril"
|
||||
desc = "Get clear!"
|
||||
luminosity = 1
|
||||
layer = ABOVE_OPEN_TURF_LAYER
|
||||
layer = BELOW_OBJ_LAYER
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
icon_state = "tendril"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/obj/effect/light_emitter/tendril/emitted_light
|
||||
|
||||
/obj/effect/collapse/New()
|
||||
..()
|
||||
/obj/effect/collapse/Initialize()
|
||||
. = ..()
|
||||
emitted_light = new(loc)
|
||||
visible_message("<span class='boldannounce'>The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!</span>")
|
||||
visible_message("<span class='warning'>Something falls free of the tendril!</span>")
|
||||
playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1)
|
||||
spawn(50)
|
||||
for(var/mob/M in range(7,src))
|
||||
shake_camera(M, 15, 1)
|
||||
playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1)
|
||||
visible_message("<span class='boldannounce'>The tendril falls inward, the ground around it widening into a yawning chasm!</span>")
|
||||
for(var/turf/T in range(2,src))
|
||||
if(!T.density)
|
||||
T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface)
|
||||
qdel(src)
|
||||
playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1)
|
||||
addtimer(CALLBACK(src, .proc/collapse), 50)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
|
||||
/obj/effect/collapse/Destroy()
|
||||
QDEL_NULL(emitted_light)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/legion
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
/obj/effect/collapse/proc/collapse()
|
||||
for(var/mob/M in range(7,src))
|
||||
shake_camera(M, 15, 1)
|
||||
playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1)
|
||||
visible_message("<span class='boldannounce'>The tendril falls inward, the ground around it widening into a yawning chasm!</span>")
|
||||
for(var/turf/T in range(2,src))
|
||||
if(!T.density)
|
||||
T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface)
|
||||
qdel(src)
|
||||
|
||||
@@ -948,7 +948,7 @@
|
||||
color = "#FFFFFF77"
|
||||
speak_chance = 20
|
||||
status_flags = GODMODE
|
||||
incorporeal_move = 1
|
||||
incorporeal_move = INCORPOREAL_MOVE_BASIC
|
||||
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/ghost/Initialize()
|
||||
|
||||
@@ -209,10 +209,10 @@
|
||||
return
|
||||
var/mob/living/L = mob
|
||||
switch(L.incorporeal_move)
|
||||
if(1)
|
||||
if(INCORPOREAL_MOVE_BASIC)
|
||||
L.loc = get_step(L, direct)
|
||||
L.setDir(direct)
|
||||
if(2)
|
||||
if(INCORPOREAL_MOVE_SHADOW)
|
||||
if(prob(50))
|
||||
var/locx
|
||||
var/locy
|
||||
@@ -250,7 +250,7 @@
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
|
||||
L.loc = get_step(L, direct)
|
||||
L.setDir(direct)
|
||||
if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
var/turf/open/floor/stepTurf = get_step(L, direct)
|
||||
for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
|
||||
to_chat(L, "<span class='warning'>[S] bars your passage!</span>")
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
var/_has_battery = 0
|
||||
var/_has_ai = 0
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/New()
|
||||
/obj/machinery/modular_computer/console/preset/Initialize()
|
||||
. = ..()
|
||||
if(!cpu)
|
||||
return
|
||||
|
||||
@@ -27,15 +27,13 @@
|
||||
|
||||
var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
|
||||
|
||||
/obj/machinery/modular_computer/New()
|
||||
..()
|
||||
/obj/machinery/modular_computer/Initialize()
|
||||
. = ..()
|
||||
cpu = new(src)
|
||||
cpu.physical = src
|
||||
|
||||
/obj/machinery/modular_computer/Destroy()
|
||||
if(cpu)
|
||||
qdel(cpu)
|
||||
cpu = null
|
||||
QDEL_NULL(cpu)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
max_integrity = 300
|
||||
integrity_failure = 150
|
||||
|
||||
/obj/machinery/modular_computer/console/buildable/New()
|
||||
..()
|
||||
/obj/machinery/modular_computer/console/buildable/Initialize()
|
||||
. = ..()
|
||||
// User-built consoles start as empty frames.
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET]
|
||||
@@ -30,8 +30,8 @@
|
||||
qdel(network_card)
|
||||
qdel(hard_drive)
|
||||
|
||||
/obj/machinery/modular_computer/console/New()
|
||||
..()
|
||||
/obj/machinery/modular_computer/console/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
|
||||
if(battery_module)
|
||||
qdel(battery_module)
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
|
||||
/obj/item/weapon/pen/sleepy/New()
|
||||
create_reagents(45)
|
||||
reagents.add_reagent("morphine", 20)
|
||||
reagents.add_reagent("chloralhydrate2", 20)
|
||||
reagents.add_reagent("mutetoxin", 15)
|
||||
reagents.add_reagent("tirizene", 10)
|
||||
..()
|
||||
@@ -205,4 +205,4 @@
|
||||
/obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user)
|
||||
P.contact_poison = "delayed_toxin"
|
||||
P.contact_poison_volume = 10
|
||||
add_logs(user,P,"used poison pen on")
|
||||
add_logs(user,P,"used poison pen on")
|
||||
|
||||
@@ -66,9 +66,8 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
icon = 'icons/obj/power_cond/power_cond_white.dmi'
|
||||
|
||||
// the power cable object
|
||||
/obj/structure/cable/New()
|
||||
..()
|
||||
|
||||
/obj/structure/cable/Initialize()
|
||||
. = ..()
|
||||
|
||||
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
|
||||
var/dash = findtext(icon_state, "-")
|
||||
@@ -529,7 +528,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
||||
return(OXYLOSS)
|
||||
|
||||
/obj/item/stack/cable_coil/New(loc, new_amount = null, var/param_color = null)
|
||||
..()
|
||||
. = ..()
|
||||
if(new_amount) // MAXCOIL by default
|
||||
amount = new_amount
|
||||
if(param_color)
|
||||
|
||||
@@ -43,8 +43,11 @@
|
||||
|
||||
var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin //standard firing pin for most guns
|
||||
|
||||
var/obj/item/device/flashlight/gun_light = null
|
||||
var/obj/item/device/flashlight/gun_light
|
||||
var/can_flashlight = 0
|
||||
var/obj/item/weapon/kitchen/knife/bayonet
|
||||
var/can_bayonet = FALSE
|
||||
var/datum/action/item_action/toggle_gunlight/alight
|
||||
|
||||
var/list/upgrades = list()
|
||||
|
||||
@@ -52,6 +55,8 @@
|
||||
var/ammo_y_offset = 0
|
||||
var/flight_x_offset = 0
|
||||
var/flight_y_offset = 0
|
||||
var/knife_x_offset = 0
|
||||
var/knife_y_offset = 0
|
||||
|
||||
//Zooming
|
||||
var/zoomable = FALSE //whether the gun generates a Zoom action on creation
|
||||
@@ -60,13 +65,12 @@
|
||||
var/datum/action/toggle_scope_zoom/azoom
|
||||
|
||||
|
||||
/obj/item/weapon/gun/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/Initialize()
|
||||
. = ..()
|
||||
if(pin)
|
||||
pin = new pin(src)
|
||||
if(gun_light)
|
||||
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
|
||||
new /datum/action/item_action/toggle_gunlight(src)
|
||||
alight = new /datum/action/item_action/toggle_gunlight(src)
|
||||
build_zooming()
|
||||
|
||||
|
||||
@@ -268,52 +272,88 @@
|
||||
SSblackbox.add_details("gun_fired","[src.type]")
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/update_icon()
|
||||
..()
|
||||
cut_overlays()
|
||||
if(gun_light && can_flashlight)
|
||||
var/state = "flight[gun_light.on? "_on":""]" //Generic state.
|
||||
if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state?
|
||||
state = gun_light.icon_state
|
||||
var/mutable_appearance/flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state)
|
||||
flashlight_overlay.pixel_x = flight_x_offset
|
||||
flashlight_overlay.pixel_y = flight_y_offset
|
||||
add_overlay(flashlight_overlay)
|
||||
if(bayonet && can_bayonet)
|
||||
var/state = "bayonet" //Generic state.
|
||||
if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
|
||||
state = bayonet.icon_state
|
||||
var/mutable_appearance/knife_overlay = mutable_appearance('icons/obj/guns/bayonets.dmi', state)
|
||||
knife_overlay.pixel_x = knife_x_offset
|
||||
knife_overlay.pixel_y = knife_y_offset
|
||||
add_overlay(knife_overlay)
|
||||
|
||||
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
|
||||
if(user.a_intent == INTENT_HARM) //Flogging
|
||||
..()
|
||||
else
|
||||
return
|
||||
if(bayonet)
|
||||
bayonet.attack(M, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/attack_obj(obj/O, mob/user)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(bayonet)
|
||||
bayonet.attack_obj(O, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/attackby(obj/item/I, mob/user, params)
|
||||
if(can_flashlight)
|
||||
if(istype(I, /obj/item/device/flashlight/seclite))
|
||||
var/obj/item/device/flashlight/seclite/S = I
|
||||
if(!gun_light)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You click [S] into place on [src].</span>")
|
||||
if(S.on)
|
||||
set_light(0)
|
||||
gun_light = S
|
||||
update_icon()
|
||||
update_gunlight(user)
|
||||
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
|
||||
var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src)
|
||||
if(loc == user)
|
||||
A.Grant(user)
|
||||
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
if(gun_light)
|
||||
for(var/obj/item/device/flashlight/seclite/S in src)
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from [src].</span>")
|
||||
gun_light = null
|
||||
S.forceMove(get_turf(user))
|
||||
update_gunlight(user)
|
||||
S.update_brightness(user)
|
||||
update_icon()
|
||||
verbs -= /obj/item/weapon/gun/proc/toggle_gunlight
|
||||
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
|
||||
qdel(TGL)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
else if(istype(I, /obj/item/device/flashlight/seclite))
|
||||
if(!can_flashlight)
|
||||
return ..()
|
||||
var/obj/item/device/flashlight/seclite/S = I
|
||||
if(!gun_light)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You click \the [S] into place on \the [src].</span>")
|
||||
if(S.on)
|
||||
set_light(0)
|
||||
gun_light = S
|
||||
update_icon()
|
||||
update_gunlight(user)
|
||||
alight = new /datum/action/item_action/toggle_gunlight(src)
|
||||
if(loc == user)
|
||||
alight.Grant(user)
|
||||
else if(istype(I, /obj/item/weapon/kitchen/knife))
|
||||
if(!can_bayonet)
|
||||
return ..()
|
||||
var/obj/item/weapon/kitchen/knife/K = I
|
||||
if(!bayonet)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You attach \the [K] to the front of ]the [src].</span>")
|
||||
bayonet = K
|
||||
update_icon()
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
if(gun_light)
|
||||
var/obj/item/device/flashlight/seclite/S = gun_light
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from \the [src].</span>")
|
||||
gun_light = null
|
||||
S.forceMove(get_turf(user))
|
||||
update_gunlight(user)
|
||||
S.update_brightness(user)
|
||||
update_icon()
|
||||
QDEL_NULL(alight)
|
||||
if(bayonet)
|
||||
var/obj/item/weapon/kitchen/knife/K = bayonet
|
||||
K.forceMove(get_turf(user))
|
||||
bayonet = null
|
||||
update_icon()
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/proc/toggle_gunlight()
|
||||
set name = "Toggle Gunlight"
|
||||
set category = "Object"
|
||||
set desc = "Click to toggle your weapon's attached flashlight."
|
||||
|
||||
if(!gun_light)
|
||||
return
|
||||
|
||||
@@ -343,12 +383,16 @@
|
||||
..()
|
||||
if(azoom)
|
||||
azoom.Grant(user)
|
||||
if(alight)
|
||||
alight.Grant(user)
|
||||
|
||||
/obj/item/weapon/gun/dropped(mob/user)
|
||||
..()
|
||||
zoom(user,FALSE)
|
||||
if(azoom)
|
||||
azoom.Remove(user)
|
||||
if(alight)
|
||||
alight.Remove(user)
|
||||
|
||||
|
||||
/obj/item/weapon/gun/AltClick(mob/user)
|
||||
@@ -370,9 +414,6 @@
|
||||
to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.")
|
||||
update_icon()
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params)
|
||||
if(!ishuman(user) || !ishuman(target))
|
||||
return
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
var/obj/item/ammo_box/magazine/magazine
|
||||
var/casing_ejector = 1 //whether the gun ejects the chambered casing
|
||||
|
||||
/obj/item/weapon/gun/ballistic/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/Initialize()
|
||||
. = ..()
|
||||
if(!spawnwithmagazine)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -99,10 +99,9 @@
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/unrestricted
|
||||
pin = /obj/item/device/firing_pin
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/c20r/afterattack()
|
||||
..()
|
||||
@@ -150,20 +149,18 @@
|
||||
fire_delay = 2
|
||||
pin = /obj/item/device/firing_pin/implant/pindicate
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/m90/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/automatic/m90/Initialize()
|
||||
. = ..()
|
||||
underbarrel = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted
|
||||
pin = /obj/item/device/firing_pin
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted/Initialize()
|
||||
. = ..()
|
||||
underbarrel = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher/unrestricted(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/m90/afterattack(atom/target, mob/living/user, flag, params)
|
||||
if(select == 2)
|
||||
@@ -259,8 +256,8 @@
|
||||
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/unrestricted
|
||||
pin = /obj/item/device/firing_pin
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/update_icon()
|
||||
|
||||
@@ -9,16 +9,16 @@
|
||||
item_state = "backpack"
|
||||
slot_flags = SLOT_BACK
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
var/obj/item/weapon/gun/ballistic/minigun/gun = null
|
||||
var/obj/item/weapon/gun/ballistic/minigun/gun
|
||||
var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded.
|
||||
var/overheat = 0
|
||||
var/overheat_max = 40
|
||||
var/heat_diffusion = 1
|
||||
|
||||
/obj/item/weapon/minigunpack/New()
|
||||
/obj/item/weapon/minigunpack/Initialize()
|
||||
. = ..()
|
||||
gun = new(src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/minigunpack/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -110,15 +110,15 @@
|
||||
casing_ejector = 0
|
||||
var/obj/item/weapon/minigunpack/ammo_pack
|
||||
|
||||
/obj/item/weapon/gun/ballistic/minigun/New()
|
||||
/obj/item/weapon/gun/ballistic/minigun/Initialize()
|
||||
SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND)
|
||||
|
||||
if(!ammo_pack)
|
||||
if(istype(loc,/obj/item/weapon/minigunpack)) //We should spawn inside a ammo pack so let's use that one.
|
||||
ammo_pack = loc
|
||||
..()
|
||||
else
|
||||
qdel(src)//No pack, no gun
|
||||
if(istype(loc, /obj/item/weapon/minigunpack)) //We should spawn inside a ammo pack so let's use that one.
|
||||
ammo_pack = loc
|
||||
else
|
||||
return INITIALIZE_HINT_QDEL //No pack, no gun
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/ballistic/minigun/attack_self(mob/living/user)
|
||||
return
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
origin_tech = "combat=3;materials=2"
|
||||
casing_ejector = 0
|
||||
|
||||
/obj/item/weapon/gun/ballistic/revolver/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/revolver/Initialize()
|
||||
. = ..()
|
||||
if(!istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder))
|
||||
verbs -= /obj/item/weapon/gun/ballistic/revolver/verb/spin
|
||||
|
||||
@@ -95,8 +95,8 @@
|
||||
unique_rename = 1
|
||||
unique_reskin = 1
|
||||
|
||||
/obj/item/weapon/gun/ballistic/revolver/detective/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/revolver/detective/Initialize()
|
||||
. = ..()
|
||||
options["Default"] = "detective"
|
||||
options["Leopard Spots"] = "detective_leopard"
|
||||
options["Black Panther"] = "detective_panther"
|
||||
@@ -177,8 +177,8 @@
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357
|
||||
var/spun = FALSE
|
||||
|
||||
/obj/item/weapon/gun/ballistic/revolver/russian/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/revolver/russian/Initialize()
|
||||
. = ..()
|
||||
do_spin()
|
||||
spun = TRUE
|
||||
update_icon()
|
||||
@@ -271,8 +271,8 @@
|
||||
unique_rename = 1
|
||||
unique_reskin = 1
|
||||
|
||||
/obj/item/weapon/gun/ballistic/revolver/doublebarrel/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/revolver/doublebarrel/Initialize()
|
||||
. = ..()
|
||||
options["Default"] = "dshotgun"
|
||||
options["Dark Red Finish"] = "dshotgun-d"
|
||||
options["Ash"] = "dshotgun-f"
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
|
||||
|
||||
/obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/Initialize()
|
||||
. = ..()
|
||||
bolt_open = 1
|
||||
pump()
|
||||
gun_type = type
|
||||
@@ -213,8 +213,8 @@
|
||||
var/toggled = 0
|
||||
var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
|
||||
|
||||
/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube/Initialize()
|
||||
. = ..()
|
||||
if (!alternate_magazine)
|
||||
alternate_magazine = new mag_type(src)
|
||||
|
||||
|
||||
@@ -35,9 +35,9 @@
|
||||
/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot
|
||||
mag_type = /obj/item/ammo_box/magazine/toy/pistol/riot
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot/New()
|
||||
/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot/Initialize()
|
||||
magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/toy/pistol/unrestricted
|
||||
pin = /obj/item/device/firing_pin
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
|
||||
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
|
||||
var/can_charge = 1 //Can it be charged in a recharger?
|
||||
var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()?
|
||||
var/charge_sections = 4
|
||||
ammo_x_offset = 2
|
||||
var/shaded_charge = 0 //if this gun uses a stateful charge bar for more detail
|
||||
@@ -25,8 +26,8 @@
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/energy/Initialize()
|
||||
. = ..()
|
||||
if(cell_type)
|
||||
power_supply = new cell_type(src)
|
||||
else
|
||||
@@ -116,7 +117,9 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/update_icon()
|
||||
cut_overlays()
|
||||
..()
|
||||
if(!automatic_charge_overlays)
|
||||
return
|
||||
var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections)
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
|
||||
var/iconState = "[icon_state]_charge"
|
||||
@@ -138,14 +141,6 @@
|
||||
add_overlay(charge_overlay)
|
||||
else
|
||||
add_overlay("[icon_state]_charge[ratio]")
|
||||
if(gun_light && can_flashlight)
|
||||
var/iconF = "flight"
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF)
|
||||
flashlight_overlay.pixel_x = flight_x_offset
|
||||
flashlight_overlay.pixel_y = flight_y_offset
|
||||
add_overlay(flashlight_overlay)
|
||||
if(itemState)
|
||||
itemState += "[ratio]"
|
||||
item_state = itemState
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
charge_sections = 3
|
||||
can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
|
||||
|
||||
/obj/item/weapon/gun/energy/e_gun/mini/New()
|
||||
/obj/item/weapon/gun/energy/e_gun/mini/Initialize()
|
||||
gun_light = new /obj/item/device/flashlight/seclite(src)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/energy/e_gun/mini/update_icon()
|
||||
..()
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
var/holds_charge = FALSE
|
||||
var/unique_frequency = FALSE // modified by KA modkits
|
||||
var/overheat = FALSE
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 15
|
||||
knife_y_offset = 13
|
||||
|
||||
var/max_mod_capacity = 100
|
||||
var/list/modkits = list()
|
||||
@@ -68,7 +71,7 @@
|
||||
unique_frequency = TRUE
|
||||
max_mod_capacity = 80
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/New()
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize()
|
||||
. = ..()
|
||||
if(!holds_charge)
|
||||
empty()
|
||||
@@ -129,19 +132,11 @@
|
||||
overheat = FALSE
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
|
||||
cut_overlays()
|
||||
..()
|
||||
|
||||
if(empty_state && !can_shoot())
|
||||
add_overlay(empty_state)
|
||||
|
||||
if(gun_light && can_flashlight)
|
||||
var/iconF = "flight"
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF)
|
||||
flashlight_overlay.pixel_x = flight_x_offset
|
||||
flashlight_overlay.pixel_y = flight_y_offset
|
||||
add_overlay(flashlight_overlay)
|
||||
|
||||
//Casing
|
||||
/obj/item/ammo_casing/energy/kinetic
|
||||
projectile_type = /obj/item/projectile/kinetic
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
/obj/item/weapon/gun/energy/pulse/prize
|
||||
pin = /obj/item/device/firing_pin
|
||||
|
||||
/obj/item/weapon/gun/energy/pulse/prize/New()
|
||||
/obj/item/weapon/gun/energy/pulse/prize/Initialize()
|
||||
. = ..()
|
||||
GLOB.poi_list |= src
|
||||
GLOB.poi_list += src
|
||||
var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]"
|
||||
|
||||
message_admins(msg)
|
||||
|
||||
@@ -44,8 +44,8 @@
|
||||
charges--//... drain a charge
|
||||
recharge_newshot()
|
||||
|
||||
/obj/item/weapon/gun/magic/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/magic/Initialize()
|
||||
. = ..()
|
||||
charges = max_charges
|
||||
chambered = new ammo_type(src)
|
||||
if(can_charge)
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
|
||||
var/variable_charges = 1
|
||||
|
||||
/obj/item/weapon/gun/magic/wand/New()
|
||||
/obj/item/weapon/gun/magic/wand/Initialize()
|
||||
if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
|
||||
if(prob(33))
|
||||
max_charges = Ceiling(max_charges / 3)
|
||||
else
|
||||
max_charges = Ceiling(max_charges / 2)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/magic/wand/examine(mob/user)
|
||||
..()
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
weapon_weight = WEAPON_MEDIUM
|
||||
|
||||
/obj/item/weapon/gun/medbeam/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/medbeam/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/weapon/gun/medbeam/Destroy(mob/user)
|
||||
@@ -128,6 +128,6 @@
|
||||
/obj/item/weapon/gun/medbeam/mech
|
||||
mounted = 1
|
||||
|
||||
/obj/item/weapon/gun/medbeam/mech/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/medbeam/mech/Initialize()
|
||||
. = ..()
|
||||
STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
var/list/syringes = list()
|
||||
var/max_syringes = 1
|
||||
|
||||
/obj/item/weapon/gun/syringe/New()
|
||||
..()
|
||||
/obj/item/weapon/gun/syringe/Initialize()
|
||||
. = ..()
|
||||
chambered = new /obj/item/ammo_casing/syringegun(src)
|
||||
|
||||
/obj/item/weapon/gun/syringe/recharge_newshot()
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
var/spread = 0 //amount (in degrees) of projectile spread
|
||||
var/legacy = 0 //legacy projectile system
|
||||
animate_movement = 0 //Use SLIDE_STEPS in conjunction with legacy
|
||||
var/ricochets = 0
|
||||
var/ricochets_max = 2
|
||||
var/ricochet_chance = 30
|
||||
|
||||
var/damage = 10
|
||||
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
|
||||
@@ -132,7 +135,11 @@
|
||||
/obj/item/projectile/Bump(atom/A, yes)
|
||||
if(!yes) //prevents double bumps.
|
||||
return
|
||||
if(firer)
|
||||
if(check_ricochet() && check_ricochet_flag(A) && ricochets < ricochets_max)
|
||||
ricochets++
|
||||
if(A.handle_ricochet(src))
|
||||
return FALSE
|
||||
if(firer && !ricochets)
|
||||
if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech
|
||||
loc = A.loc
|
||||
return 0
|
||||
@@ -166,6 +173,16 @@
|
||||
picked_mob.bullet_act(src, def_zone)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/proc/check_ricochet()
|
||||
if(prob(ricochet_chance))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/projectile/proc/check_ricochet_flag(atom/A)
|
||||
if(A.flags & CHECK_RICOCHET)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/projectile/Process_Spacemove(var/movement_dir = 0)
|
||||
return 1 //Bullets don't drift in space
|
||||
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
eyeblur = 2
|
||||
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
|
||||
light_color = LIGHT_COLOR_RED
|
||||
|
||||
ricochets_max = 50 //Honk!
|
||||
ricochet_chance = 80
|
||||
|
||||
/obj/item/projectile/beam/laser
|
||||
|
||||
/obj/item/projectile/beam/laser/heavylaser
|
||||
|
||||
@@ -351,21 +351,9 @@
|
||||
|
||||
/obj/item/projectile/magic/aoe/Range()
|
||||
if(proxdet)
|
||||
var/turf/T1 = get_step(src,turn(dir, -45))
|
||||
var/turf/T2 = get_step(src,turn(dir, 45))
|
||||
var/turf/T3 = get_step(src,dir)
|
||||
var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1) //Magic Bullet #teachthecontroversy
|
||||
return
|
||||
L = locate(/mob/living) in T2
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1)
|
||||
return
|
||||
L = locate(/mob/living) in T3
|
||||
if(L && L.stat != DEAD)
|
||||
Bump(L,1)
|
||||
return
|
||||
for(var/mob/living/L in range(1, get_turf(src)))
|
||||
if(L.stat != DEAD && L != firer)
|
||||
return Bump(L, TRUE)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/magic/aoe/lightning
|
||||
|
||||
@@ -242,6 +242,7 @@
|
||||
//Between normal and advanced for damage, made a beam so not the turret does not destroy glass
|
||||
name = "plasma beam"
|
||||
damage = 6
|
||||
range = 7
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
|
||||
|
||||
@@ -96,12 +96,12 @@
|
||||
origin.feed_slime_action.Remove(C)
|
||||
origin.monkey_recycle_action.Remove(C)
|
||||
//All of this stuff below could probably be a proc for all advanced cameras, only the action removal needs to be camera specific
|
||||
remote_eye.eye_user = null
|
||||
C.reset_perspective(null)
|
||||
if(C.client)
|
||||
C.client.images -= remote_eye.user_image
|
||||
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
|
||||
chunk.remove(remote_eye)
|
||||
remote_eye.eye_user = null
|
||||
C.remote_control = null
|
||||
C.unset_machine()
|
||||
Remove(C)
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
SendToStation()
|
||||
return
|
||||
|
||||
var/found_awake = PersonCheck()
|
||||
var/found_awake = PersonCheck() || NukeDiskCheck()
|
||||
if(mode == SHUTTLE_CALL)
|
||||
if(found_awake)
|
||||
SendToStation()
|
||||
@@ -128,6 +128,12 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/NukeDiskCheck()
|
||||
for (var/obj/item/weapon/disk/nuclear/N in GLOB.poi_list)
|
||||
if (get_area(N) in areas)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/SendToStation()
|
||||
var/dockTime = config.arrivals_shuttle_dock_window
|
||||
if(mode == SHUTTLE_CALL && timeLeft(1) > dockTime)
|
||||
@@ -140,15 +146,22 @@
|
||||
var/docked = S1 == assigned_transit
|
||||
sound_played = FALSE
|
||||
if(docked) //about to launch
|
||||
if(!force_depart && PersonCheck())
|
||||
mode = SHUTTLE_IDLE
|
||||
if(console)
|
||||
console.say("Launch cancelled, lifeform dectected on board.")
|
||||
return
|
||||
if(!force_depart)
|
||||
var/cancel_reason
|
||||
if(PersonCheck())
|
||||
cancel_reason = "lifeform dectected on board"
|
||||
else if(NukeDiskCheck())
|
||||
cancel_reason = "critical station device detected on board"
|
||||
if(cancel_reason)
|
||||
mode = SHUTTLE_IDLE
|
||||
if(console)
|
||||
console.say("Launch cancelled, [cancel_reason].")
|
||||
return
|
||||
force_depart = FALSE
|
||||
. = ..()
|
||||
if(!. && !docked && !damaged)
|
||||
console.say("Welcome to your new life, employees!")
|
||||
if(console)
|
||||
console.say("Welcome to your new life, employees!")
|
||||
for(var/L in queued_announces)
|
||||
var/datum/callback/C = L
|
||||
C.Invoke()
|
||||
|
||||
@@ -725,16 +725,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
item = /obj/item/weapon/grenade/clusterbuster/soap
|
||||
cost = 6
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/door_charge
|
||||
name = "Explosive Airlock Charge"
|
||||
desc = "A small, easily concealable device. It can be applied to an open airlock panel, booby-trapping it. \
|
||||
The next person to use that airlock will trigger an explosion, knocking them down and destroying \
|
||||
the airlock maintenance panel."
|
||||
item = /obj/item/device/doorCharge
|
||||
cost = 2
|
||||
surplus = 10
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
// Stealth Items
|
||||
/datum/uplink_item/stealthy_tools
|
||||
category = "Stealth and Camouflage Items"
|
||||
|
||||
@@ -70,8 +70,10 @@
|
||||
|
||||
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
|
||||
|
||||
if(!owner.revive(full_heal = TRUE))
|
||||
return
|
||||
|
||||
owner.grab_ghost()
|
||||
owner.revive(full_heal = TRUE)
|
||||
owner.visible_message("<span class='danger'>[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!</span>", "<span class='alien'>You HUNGER!</span>")
|
||||
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
|
||||
owner.do_jitter_animation(living_transformation_time * 10)
|
||||
|
||||
Reference in New Issue
Block a user