mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 04:27:35 +01:00
Merge branch 'master' into mhelp-take
This commit is contained in:
@@ -126,7 +126,7 @@
|
||||
/obj/screen/blob/Split
|
||||
icon_state = "ui_split"
|
||||
name = "Split consciousness (100)"
|
||||
desc = "Creates another Blob Overmind at the nearest node. One use only.<br>Offsprings are be unable to use this ability."
|
||||
desc = "Creates another Blob Overmind at the targeted node. One use only.<br>Offspring are unable to use this ability."
|
||||
|
||||
/obj/screen/blob/Split/Click()
|
||||
if(isovermind(usr))
|
||||
|
||||
@@ -337,8 +337,8 @@ UI STUFF
|
||||
return TRUE
|
||||
|
||||
//Sends a message to the designated staff
|
||||
/datum/controller/subsystem/tickets/proc/message_staff(var/msg)
|
||||
message_adminTicket(msg)
|
||||
/datum/controller/subsystem/tickets/proc/message_staff(var/msg, var/alt = FALSE)
|
||||
message_adminTicket(msg, alt)
|
||||
|
||||
/datum/controller/subsystem/tickets/Topic(href, href_list)
|
||||
|
||||
@@ -406,5 +406,8 @@ UI STUFF
|
||||
|
||||
/datum/controller/subsystem/tickets/proc/takeTicket(var/index)
|
||||
if(assignStaffToTicket(usr.client, index))
|
||||
message_staff("<span class='[span_class]'>[usr.client] / ([usr]) has taken [ticket_name] number [index]</span>")
|
||||
if(span_class == "mentorhelp")
|
||||
message_staff("<span class='[span_class]'>[usr.client] / ([usr]) has taken [ticket_name] number [index]</span>")
|
||||
else
|
||||
message_staff("<span class='admin_channel'>[usr.client] / ([usr]) has taken [ticket_name] number [index]</span>", TRUE)
|
||||
to_chat_safe(returnClient(index), "<span class='[span_class]'>Your [ticket_name] is being handled by [usr.client].</span>")
|
||||
|
||||
+13
-5
@@ -62,6 +62,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that
|
||||
|
||||
var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges"
|
||||
var/starts_charged = TRUE //Does this spell start ready to go?
|
||||
var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges"
|
||||
var/still_recharging_msg = "<span class='notice'>The spell is still recharging.</span>"
|
||||
|
||||
@@ -195,9 +196,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
/obj/effect/proc_holder/spell/New()
|
||||
..()
|
||||
action = new(src)
|
||||
|
||||
still_recharging_msg = "<span class='notice'>[name] is still recharging.</span>"
|
||||
charge_counter = charge_max
|
||||
if(starts_charged)
|
||||
charge_counter = charge_max
|
||||
else
|
||||
start_recharge()
|
||||
|
||||
/obj/effect/proc_holder/spell/Destroy()
|
||||
QDEL_NULL(action)
|
||||
@@ -214,9 +217,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
/obj/effect/proc_holder/spell/proc/start_recharge()
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
while(charge_counter < charge_max)
|
||||
sleep(1)
|
||||
charge_counter++
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/effect/proc_holder/spell/process()
|
||||
charge_counter += 2
|
||||
if(charge_counter < charge_max)
|
||||
return
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
charge_counter = charge_max
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
|
||||
+4
-1
@@ -337,6 +337,9 @@
|
||||
if(AM && isturf(AM.loc))
|
||||
step(AM, turn(AM.dir, 180))
|
||||
|
||||
/atom/proc/get_spooked()
|
||||
return
|
||||
|
||||
/atom/proc/add_hiddenprint(mob/living/M as mob)
|
||||
if(isnull(M)) return
|
||||
if(isnull(M.key)) return
|
||||
@@ -655,7 +658,7 @@ var/list/blood_splatter_icons = list()
|
||||
if(V.type == type)
|
||||
V.reagents.add_reagent(vomit_reagent, 5)
|
||||
return
|
||||
|
||||
|
||||
var/obj/effect/decal/cleanable/vomit/this = new type(src)
|
||||
|
||||
// Make toxins vomit look different
|
||||
|
||||
@@ -105,7 +105,11 @@
|
||||
|
||||
spawn()
|
||||
if(!new_overmind)
|
||||
candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
if(is_offspring)
|
||||
candidates = pollCandidates("Do you want to play as a blob offspring?", ROLE_BLOB, 1)
|
||||
else
|
||||
candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
else
|
||||
@@ -123,7 +127,6 @@
|
||||
if(is_offspring)
|
||||
B.is_offspring = TRUE
|
||||
|
||||
|
||||
/obj/structure/blob/core/proc/lateblobtimer()
|
||||
addtimer(CALLBACK(src, .proc/lateblobcheck), 50)
|
||||
|
||||
|
||||
@@ -350,31 +350,32 @@
|
||||
BS.Goto(pick(surrounding_turfs), BS.move_to_delay)
|
||||
return
|
||||
|
||||
|
||||
/mob/camera/blob/verb/split_consciousness()
|
||||
set category = "Blob"
|
||||
set name = "Split consciousness (100) (One use)"
|
||||
set desc = "Expend resources to attempt to produce another sentient overmind."
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return
|
||||
if(split_used)
|
||||
to_chat(src, "<span class='warning'>You have already produced an offspring.</span>")
|
||||
return
|
||||
if(is_offspring)
|
||||
to_chat(src, "<span class='warning'>You cannot split as an offspring of another Blob.</span>")
|
||||
return
|
||||
if(!blob_nodes || !blob_nodes.len)
|
||||
to_chat(src, "<span class='warning'>A node is required to birth your offspring...</span>")
|
||||
return
|
||||
var/obj/structure/blob/node/N = locate(/obj/structure/blob) in blob_nodes
|
||||
if(!N)
|
||||
to_chat(src, "<span class='warning'>A node is required to birth your offspring...</span>")
|
||||
return
|
||||
|
||||
var/obj/structure/blob/N = (locate(/obj/structure/blob) in T)
|
||||
if(!N)
|
||||
to_chat(src, "<span class='warning'>A node is required to birth your offspring.</span>")
|
||||
return
|
||||
if(!istype(N, /obj/structure/blob/node))
|
||||
to_chat(src, "<span class='warning'>A node is required to birth your offspring.</span>")
|
||||
return
|
||||
if(!can_buy(100))
|
||||
return
|
||||
|
||||
split_used = TRUE
|
||||
|
||||
new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring")
|
||||
qdel(N)
|
||||
|
||||
@@ -382,7 +383,6 @@
|
||||
var/datum/game_mode/blob/BL = SSticker.mode
|
||||
BL.blobwincount += initial(BL.blobwincount)
|
||||
|
||||
|
||||
/mob/camera/blob/verb/blob_broadcast()
|
||||
set category = "Blob"
|
||||
set name = "Blob Broadcast"
|
||||
|
||||
@@ -18,7 +18,6 @@ var/list/sting_paths
|
||||
var/dat = create_menu(changeling)
|
||||
usr << browse(dat, "window=powers;size=600x700")//900x480
|
||||
|
||||
|
||||
/datum/action/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling)
|
||||
var/dat
|
||||
dat +="<html><head><title>Changeling Evolution Menu</title></head>"
|
||||
@@ -298,12 +297,10 @@ var/list/sting_paths
|
||||
/////
|
||||
|
||||
/datum/changeling/proc/purchasePower(var/mob/living/carbon/user, var/sting_name)
|
||||
|
||||
var/datum/action/changeling/thepower = null
|
||||
var/list/all_powers = init_subtypes(/datum/action/changeling)
|
||||
|
||||
if(!sting_paths)
|
||||
sting_paths = init_subtypes(/datum/action/changeling)
|
||||
for(var/datum/action/changeling/cling_sting in sting_paths)
|
||||
for(var/datum/action/changeling/cling_sting in all_powers)
|
||||
if(cling_sting.name == sting_name)
|
||||
thepower = cling_sting
|
||||
|
||||
@@ -344,21 +341,19 @@ var/list/sting_paths
|
||||
to_chat(user, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
|
||||
user.remove_changeling_powers(1)
|
||||
canrespec = 0
|
||||
user.make_changeling()
|
||||
user.make_changeling(FALSE)
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='danger'>You lack the power to readapt your evolutions!</span>")
|
||||
return 0
|
||||
|
||||
/mob/proc/make_changeling()
|
||||
/mob/proc/make_changeling(var/get_free_powers = TRUE)
|
||||
if(!mind)
|
||||
return
|
||||
if(!ishuman(src))
|
||||
return
|
||||
if(!mind.changeling)
|
||||
mind.changeling = new /datum/changeling(gender)
|
||||
if(!sting_paths)
|
||||
sting_paths = init_subtypes(/datum/action/changeling)
|
||||
if(mind.changeling.purchasedpowers)
|
||||
remove_changeling_powers(1)
|
||||
|
||||
@@ -367,13 +362,23 @@ var/list/sting_paths
|
||||
for(var/language in languages)
|
||||
mind.changeling.absorbed_languages |= language
|
||||
|
||||
// purchase free powers.
|
||||
for(var/datum/action/changeling/path in sting_paths)
|
||||
//var/datum/action/changeling/S = new path()
|
||||
if(!path.dna_cost)
|
||||
if(!mind.changeling.has_sting(path))
|
||||
mind.changeling.purchasedpowers += path
|
||||
path.on_purchase(src)
|
||||
if(get_free_powers)
|
||||
var/list/all_powers = init_subtypes(/datum/action/changeling)
|
||||
for(var/datum/action/changeling/path in all_powers) // purchase free powers.
|
||||
if(!path.dna_cost)
|
||||
if(!mind.changeling.has_sting(path))
|
||||
mind.changeling.purchasedpowers += path
|
||||
path.on_purchase(src)
|
||||
else //for respec
|
||||
var/datum/action/changeling/hivemind_upload/S1 = new
|
||||
if(!mind.changeling.has_sting(S1))
|
||||
mind.changeling.purchasedpowers+=S1
|
||||
S1.Grant(src)
|
||||
|
||||
var/datum/action/changeling/hivemind_download/S2 = new
|
||||
if(!mind.changeling.has_sting(S2))
|
||||
mind.changeling.purchasedpowers+=S2
|
||||
S2.Grant(src)
|
||||
|
||||
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
|
||||
mind.changeling.absorbed_dna |= C.dna.Clone()
|
||||
|
||||
@@ -459,8 +459,8 @@
|
||||
organData["germ_level"] = I.germ_level
|
||||
organData["damage"] = I.damage
|
||||
organData["maxHealth"] = I.max_damage
|
||||
organData["bruised"] = I.min_broken_damage
|
||||
organData["broken"] = I.min_bruised_damage
|
||||
organData["bruised"] = I.min_bruised_damage
|
||||
organData["broken"] = I.min_broken_damage
|
||||
organData["robotic"] = I.is_robotic()
|
||||
organData["dead"] = (I.status & ORGAN_DEAD)
|
||||
|
||||
|
||||
@@ -231,9 +231,9 @@
|
||||
/obj/item/reagent_containers/hypospray/CMO,
|
||||
/obj/item/clothing/accessory/medal/gold/captain,
|
||||
/obj/item/clothing/gloves/color/black/krav_maga/sec,
|
||||
/obj/item/storage/internal,
|
||||
/obj/item/spacepod_key,
|
||||
/obj/item/nullrod
|
||||
/obj/item/nullrod,
|
||||
/obj/item/key
|
||||
)
|
||||
// These items will NOT be preserved
|
||||
var/list/do_not_preserve_items = list (
|
||||
|
||||
@@ -78,6 +78,9 @@
|
||||
set_picture("ai_bsod")
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/status_display/get_spooked()
|
||||
spookymode = TRUE
|
||||
|
||||
// set what is displayed
|
||||
/obj/machinery/status_display/proc/update()
|
||||
if(friendc && !ignore_friendc)
|
||||
@@ -227,6 +230,9 @@
|
||||
set_picture("ai_bsod")
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/ai_status_display/get_spooked()
|
||||
spookymode = TRUE
|
||||
|
||||
/obj/machinery/ai_status_display/proc/update()
|
||||
if(mode==0) //Blank
|
||||
overlays.Cut()
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
break
|
||||
if(!throw_item)
|
||||
return
|
||||
throw_item.throw_at(target, 16, 3, src)
|
||||
throw_item.throw_at(target, 16, 3)
|
||||
visible_message("<span class='danger'>[src] launches [throw_item.name] at [target.name]!</span>")
|
||||
|
||||
/obj/machinery/vending/onTransitZ()
|
||||
|
||||
@@ -31,31 +31,9 @@
|
||||
if(..())
|
||||
return
|
||||
|
||||
R.notify_ai(2)
|
||||
R.reset_module()
|
||||
|
||||
R.uneq_all()
|
||||
R.sight_mode = null
|
||||
R.hands.icon_state = "nomod"
|
||||
R.icon_state = "robot"
|
||||
R.module.remove_subsystems_and_actions(R)
|
||||
QDEL_NULL(R.module)
|
||||
|
||||
R.camera.network.Remove(list("Engineering", "Medical", "Mining Outpost"))
|
||||
R.rename_character(R.real_name, R.get_default_name("Default"))
|
||||
R.languages = list()
|
||||
R.speech_synthesizer_langs = list()
|
||||
|
||||
R.update_icons()
|
||||
R.update_headlamp()
|
||||
|
||||
R.speed = 0 // Remove upgrades.
|
||||
R.ionpulse = 0
|
||||
R.magpulse = 0
|
||||
R.add_language("Robot Talk", 1)
|
||||
|
||||
R.status_flags |= CANPUSH
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/rename
|
||||
name = "cyborg reclassification board"
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
if(flags & NODROP)
|
||||
to_chat(user, "<span class='warning'>[src] is stuck to your hand!</span>")
|
||||
return
|
||||
|
||||
if((CLUMSY in user.mutations) && prob(50) && (!ignoresClumsy))
|
||||
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
|
||||
apply_cuffs(user, user)
|
||||
|
||||
@@ -299,6 +299,10 @@
|
||||
/turf/proc/Bless()
|
||||
flags |= NOJAUNT
|
||||
|
||||
/turf/get_spooked()
|
||||
for(var/atom/movable/AM in contents)
|
||||
AM.get_spooked()
|
||||
|
||||
/turf/proc/burn_down()
|
||||
return
|
||||
|
||||
|
||||
@@ -21,8 +21,11 @@ var/global/nologevent = 0
|
||||
to_chat(C, msg)
|
||||
|
||||
|
||||
/proc/message_adminTicket(var/msg)
|
||||
msg = "<span class='adminticket'><span class='prefix'>ADMIN TICKET:</span> [msg]</span>"
|
||||
/proc/message_adminTicket(var/msg, var/alt = FALSE)
|
||||
if(alt)
|
||||
msg = "<span class=admin_channel>ADMIN TICKET: [msg]</span>"
|
||||
else
|
||||
msg = "<span class=adminticket><span class='prefix'>ADMIN TICKET:</span> [msg]</span>"
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN & C.holder.rights)
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS))
|
||||
|
||||
@@ -10,14 +10,15 @@
|
||||
permeability_coefficient = 0.50
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey" )
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey", "Plasmaman" )
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/mask.dmi'
|
||||
"Drask" = 'icons/mob/species/drask/mask.dmi',
|
||||
"Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/breath/attack_self(var/mob/user)
|
||||
|
||||
@@ -10,14 +10,15 @@
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey", "Plasmaman" )
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/mask.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi',
|
||||
"Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi'
|
||||
)
|
||||
|
||||
// **** Welding gas mask ****
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
|
||||
|
||||
var/global/list/boo_phrases=list(
|
||||
GLOBAL_LIST_INIT(boo_phrases, list(
|
||||
"You feel a chill run down your spine.",
|
||||
"You think you see a figure in your peripheral vision.",
|
||||
"What was that?",
|
||||
@@ -9,16 +7,17 @@ var/global/list/boo_phrases=list(
|
||||
"Something doesn't feel right...",
|
||||
"You feel a presence in the room.",
|
||||
"It feels like someone's standing behind you.",
|
||||
)
|
||||
))
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/boo
|
||||
name = "Boo!"
|
||||
desc = "Fuck with the living."
|
||||
|
||||
ghost = 1
|
||||
ghost = TRUE
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 600
|
||||
starts_charged = FALSE
|
||||
clothes_req = 0
|
||||
stat_allowed = 1
|
||||
invocation = ""
|
||||
@@ -27,26 +26,4 @@ var/global/list/boo_phrases=list(
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/boo/cast(list/targets, mob/user = usr)
|
||||
for(var/turf/T in targets)
|
||||
for(var/atom/A in T.contents)
|
||||
|
||||
// Bug humans
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(H && H.client)
|
||||
to_chat(H, "<i>[pick(boo_phrases)]</i>")
|
||||
|
||||
// Flicker unblessed lights in range
|
||||
if(istype(A,/obj/machinery/light))
|
||||
var/obj/machinery/light/L = A
|
||||
if(L)
|
||||
L.flicker()
|
||||
|
||||
// OH GOD BLUE APC (single animation cycle)
|
||||
if(istype(A, /obj/machinery/power/apc))
|
||||
A:spookify()
|
||||
|
||||
if(istype(A, /obj/machinery/status_display))
|
||||
A:spookymode=1
|
||||
|
||||
if(istype(A, /obj/machinery/ai_status_display))
|
||||
A:spookymode=1
|
||||
T.get_spooked()
|
||||
|
||||
@@ -2003,6 +2003,9 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
|
||||
genemutcheck(src, block, null, MUTCHK_FORCED)
|
||||
dna.UpdateSE()
|
||||
|
||||
/mob/living/carbon/human/get_spooked()
|
||||
to_chat(src, "<span class='whisper'>[pick(GLOB.boo_phrases)]</span>")
|
||||
|
||||
/mob/living/carbon/human/extinguish_light()
|
||||
// Parent function handles stuff the human may be holding
|
||||
..()
|
||||
|
||||
@@ -44,9 +44,9 @@
|
||||
return has_organ("chest")
|
||||
if(slot_wear_id)
|
||||
// the only relevant check for this is the uniform check
|
||||
return 1
|
||||
return TRUE
|
||||
if(slot_wear_pda)
|
||||
return 1
|
||||
return TRUE
|
||||
if(slot_l_ear)
|
||||
return has_organ("head")
|
||||
if(slot_r_ear)
|
||||
@@ -70,9 +70,9 @@
|
||||
if(slot_s_store)
|
||||
return has_organ("chest")
|
||||
if(slot_in_backpack)
|
||||
return 1
|
||||
return TRUE
|
||||
if(slot_tie)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
// The actual dropping happens at the mob level - checks to prevent drops should
|
||||
// come here
|
||||
@@ -421,56 +421,34 @@
|
||||
|
||||
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
|
||||
switch(dna.species.handle_can_equip(I, slot, disable_warning, src))
|
||||
if(1) return 1
|
||||
if(2) return 0 //if it returns 2, it wants no normal handling
|
||||
|
||||
if(1) return TRUE
|
||||
if(2) return FALSE //if it returns 2, it wants no normal handling
|
||||
if(!has_organ_for_slot(slot))
|
||||
return FALSE
|
||||
|
||||
if(istype(I, /obj/item/clothing/under) || istype(I, /obj/item/clothing/suit))
|
||||
if(FAT in mutations)
|
||||
//testing("[M] TOO FAT TO WEAR [src]!")
|
||||
if(!(I.flags_size & ONESIZEFITSALL))
|
||||
if(!disable_warning)
|
||||
to_chat(src, "<span class='alert'>You're too fat to wear the [I].</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
switch(slot)
|
||||
if(slot_l_hand)
|
||||
if(l_hand)
|
||||
return 0
|
||||
return !incapacitated()
|
||||
return !l_hand && !incapacitated()
|
||||
if(slot_r_hand)
|
||||
if(r_hand)
|
||||
return 0
|
||||
return !incapacitated()
|
||||
return !r_hand && !incapacitated()
|
||||
if(slot_wear_mask)
|
||||
if(wear_mask)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_MASK))
|
||||
return 0
|
||||
return 1
|
||||
return !wear_mask && (I.slot_flags & SLOT_MASK)
|
||||
if(slot_back)
|
||||
if(back)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_BACK))
|
||||
return 0
|
||||
return 1
|
||||
return !back && (I.slot_flags & SLOT_BACK)
|
||||
if(slot_wear_suit)
|
||||
if(wear_suit)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_OCLOTHING))
|
||||
return 0
|
||||
return 1
|
||||
return !wear_suit && (I.slot_flags & SLOT_OCLOTHING)
|
||||
if(slot_gloves)
|
||||
if(gloves)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_GLOVES))
|
||||
return 0
|
||||
return 1
|
||||
return !gloves && (I.slot_flags & SLOT_GLOVES)
|
||||
if(slot_shoes)
|
||||
if(shoes)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_FEET))
|
||||
return 0
|
||||
return 1
|
||||
return !shoes && (I.slot_flags & SLOT_FEET)
|
||||
if(slot_belt)
|
||||
if(belt)
|
||||
return 0
|
||||
@@ -482,39 +460,15 @@
|
||||
return
|
||||
return 1
|
||||
if(slot_glasses)
|
||||
if(glasses)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_EYES))
|
||||
return 0
|
||||
return 1
|
||||
return !glasses && (I.slot_flags & SLOT_EYES)
|
||||
if(slot_head)
|
||||
if(head)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_HEAD))
|
||||
return 0
|
||||
return 1
|
||||
return !head && (I.slot_flags & SLOT_HEAD)
|
||||
if(slot_l_ear)
|
||||
if(l_ear)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_EARS))
|
||||
return 0
|
||||
if((I.slot_flags & SLOT_TWOEARS) && r_ear )
|
||||
return 0
|
||||
return 1
|
||||
return !l_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && r_ear)
|
||||
if(slot_r_ear)
|
||||
if(r_ear)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_EARS))
|
||||
return 0
|
||||
if((I.slot_flags & SLOT_TWOEARS) && l_ear)
|
||||
return 0
|
||||
return 1
|
||||
return !r_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && l_ear)
|
||||
if(slot_w_uniform)
|
||||
if(w_uniform)
|
||||
return 0
|
||||
if(!(I.slot_flags & SLOT_ICLOTHING))
|
||||
return 0
|
||||
return 1
|
||||
return !w_uniform && (I.slot_flags & SLOT_ICLOTHING)
|
||||
if(slot_wear_id)
|
||||
if(wear_id)
|
||||
return 0
|
||||
@@ -583,17 +537,9 @@
|
||||
return 1
|
||||
return 0
|
||||
if(slot_handcuffed)
|
||||
if(handcuffed)
|
||||
return 0
|
||||
if(!istype(I, /obj/item/restraints/handcuffs))
|
||||
return 0
|
||||
return 1
|
||||
return !handcuffed && istype(I, /obj/item/restraints/handcuffs)
|
||||
if(slot_legcuffed)
|
||||
if(legcuffed)
|
||||
return 0
|
||||
if(!istype(I, /obj/item/restraints/legcuffs))
|
||||
return 0
|
||||
return 1
|
||||
return !legcuffed && istype(I, /obj/item/restraints/legcuffs)
|
||||
if(slot_in_backpack)
|
||||
if(back && istype(back, /obj/item/storage/backpack))
|
||||
var/obj/item/storage/backpack/B = back
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
genemutcheck(H, MONKEYBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
/datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
|
||||
if(!user.has_organ_for_slot(slot))
|
||||
return 2
|
||||
switch(slot)
|
||||
if(slot_l_hand)
|
||||
if(user.l_hand)
|
||||
|
||||
@@ -18,6 +18,14 @@
|
||||
if(ranged_ability)
|
||||
ranged_ability.add_ranged_ability(src, "<span class='notice'>You currently have <b>[ranged_ability]</b> active!</span>")
|
||||
|
||||
//for when action buttons are lost and need to be regained, such as when the mind enters a new mob
|
||||
var/datum/changeling/changeling = usr.mind.changeling
|
||||
if(changeling)
|
||||
for(var/power in changeling.purchasedpowers)
|
||||
var/datum/action/changeling/S = power
|
||||
if(istype(S) && S.needs_button)
|
||||
S.Grant(src)
|
||||
|
||||
//Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways.
|
||||
update_pipe_vision()
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@ var/list/robot_verbs_default = list(
|
||||
if(islist(force_modules) && force_modules.len)
|
||||
modules = force_modules.Copy()
|
||||
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
|
||||
to_chat(src, "<span class='warning'>Crisis mode active. Combat module available.</span>")
|
||||
to_chat(src, "<span class='warning'>Crisis mode active. The combat module is now available.</span>")
|
||||
modules += "Combat"
|
||||
if(mmi != null && mmi.alien)
|
||||
modules = list("Hunter")
|
||||
@@ -417,6 +417,31 @@ var/list/robot_verbs_default = list(
|
||||
radio.config(module.channels)
|
||||
notify_ai(2)
|
||||
|
||||
/mob/living/silicon/robot/proc/reset_module()
|
||||
notify_ai(2)
|
||||
|
||||
uneq_all()
|
||||
sight_mode = null
|
||||
hands.icon_state = "nomod"
|
||||
icon_state = "robot"
|
||||
module.remove_subsystems_and_actions(src)
|
||||
QDEL_NULL(module)
|
||||
|
||||
camera.network.Remove(list("Engineering", "Medical", "Mining Outpost"))
|
||||
rename_character(real_name, get_default_name("Default"))
|
||||
languages = list()
|
||||
speech_synthesizer_langs = list()
|
||||
|
||||
update_icons()
|
||||
update_headlamp()
|
||||
|
||||
speed = 0 // Remove upgrades.
|
||||
ionpulse = FALSE
|
||||
magpulse = FALSE
|
||||
add_language("Robot Talk", 1)
|
||||
|
||||
status_flags |= CANPUSH
|
||||
|
||||
//for borg hotkeys, here module refers to borg inv slot, not core module
|
||||
/mob/living/silicon/robot/verb/cmd_toggle_module(module as num)
|
||||
set name = "Toggle Module"
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
/mob/living/simple_animal/mouse/Life()
|
||||
..()
|
||||
if(prob(0.5))
|
||||
if(prob(0.5) && !ckey)
|
||||
stat = UNCONSCIOUS
|
||||
icon_state = "mouse_[mouse_color]_sleep"
|
||||
wander = 0
|
||||
@@ -220,4 +220,4 @@
|
||||
response_harm = "stamps on"
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
can_collar = 0
|
||||
butcher_results = list(/obj/item/stack/sheet/metal = 1)
|
||||
butcher_results = list(/obj/item/stack/sheet/metal = 1)
|
||||
|
||||
+16
-14
@@ -49,7 +49,6 @@
|
||||
use_power = NO_POWER_USE
|
||||
req_access = list(access_engine_equip)
|
||||
siemens_strength = 1
|
||||
var/spooky=0
|
||||
var/area/area
|
||||
var/areastring = null
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
@@ -248,9 +247,9 @@
|
||||
|
||||
// update the APC icon to show the three base states
|
||||
// also add overlays for indicator lights
|
||||
/obj/machinery/power/apc/update_icon()
|
||||
/obj/machinery/power/apc/update_icon(force_update = FALSE)
|
||||
|
||||
if(!status_overlays)
|
||||
if(!status_overlays || force_update)
|
||||
status_overlays = 1
|
||||
status_overlays_lock = new
|
||||
status_overlays_charging = new
|
||||
@@ -291,10 +290,10 @@
|
||||
var/update = check_updates() //returns 0 if no need to update icons.
|
||||
// 1 if we need to update the icon_state
|
||||
// 2 if we need to update the overlays
|
||||
if(!update)
|
||||
if(!update && !force_update)
|
||||
return
|
||||
|
||||
if(update & 1) // Updating the icon state
|
||||
if(force_update || update & 1) // Updating the icon state
|
||||
if(update_state & UPSTATE_ALLGOOD)
|
||||
icon_state = "apc0"
|
||||
else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2))
|
||||
@@ -322,7 +321,7 @@
|
||||
|
||||
|
||||
|
||||
if(update & 2)
|
||||
if(force_update || update & 2)
|
||||
|
||||
if(overlays.len)
|
||||
overlays.len = 0
|
||||
@@ -412,14 +411,17 @@
|
||||
update_icon()
|
||||
updating_icon = 0
|
||||
|
||||
/obj/machinery/power/apc/proc/spookify()
|
||||
if(spooky) return // Fuck you we're already spooky
|
||||
spooky=1
|
||||
update_icon()
|
||||
spawn(10)
|
||||
spooky=0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/power/apc/get_spooked(second_pass = FALSE)
|
||||
if(opened || wiresexposed)
|
||||
return
|
||||
if(stat & (NOPOWER | BROKEN))
|
||||
return
|
||||
if(!second_pass) //The first time, we just cut overlays
|
||||
addtimer(CALLBACK(src, .get_spooked, TRUE), 1)
|
||||
cut_overlays()
|
||||
else
|
||||
flick("apcemag", src) //Second time we cause the APC to update its icon, then add a timer to update icon later
|
||||
addtimer(CALLBACK(src, .proc/update_icon, TRUE), 10)
|
||||
|
||||
//attack with an item - open/close cover, insert cell, or (un)lock interface
|
||||
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params)
|
||||
|
||||
@@ -232,6 +232,9 @@
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
/obj/machinery/light/get_spooked()
|
||||
flicker()
|
||||
|
||||
// update the icon_state and luminosity of the light depending on its state
|
||||
/obj/machinery/light/proc/update(var/trigger = TRUE)
|
||||
switch(status)
|
||||
|
||||
@@ -31,6 +31,15 @@
|
||||
// Mark down this time to prevent shuttle cheese
|
||||
SSshuttle.emergency_sec_level_time = world.time
|
||||
|
||||
// Reset gamma borgs if the new security level is lower than Gamma.
|
||||
if(level < SEC_LEVEL_GAMMA)
|
||||
for(var/M in GLOB.silicon_mob_list)
|
||||
if(isrobot(M))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(istype(R.module, /obj/item/robot_module/combat) && !R.crisis)
|
||||
R.reset_module()
|
||||
to_chat(R, "<span class='warning'>Crisis mode deactivated. The combat module is no longer available and your module has been reset.</span>")
|
||||
|
||||
switch(level)
|
||||
if(SEC_LEVEL_GREEN)
|
||||
security_announcement_down.Announce("All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.","Attention! Security level lowered to green.")
|
||||
@@ -176,15 +185,3 @@
|
||||
return SEC_LEVEL_EPSILON
|
||||
if("delta")
|
||||
return SEC_LEVEL_DELTA
|
||||
|
||||
|
||||
/*DEBUG
|
||||
/mob/verb/set_thing0()
|
||||
set_security_level(0)
|
||||
/mob/verb/set_thing1()
|
||||
set_security_level(1)
|
||||
/mob/verb/set_thing2()
|
||||
set_security_level(2)
|
||||
/mob/verb/set_thing3()
|
||||
set_security_level(3)
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Kyep"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "unanchored vending machines will no longer generate a runtime error when throwing products at people."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "farie82"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Can't use cuffs now while you have antidrop"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "farie82"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "can_equip now checks if you have the limbs required to equip something"
|
||||
@@ -0,0 +1,5 @@
|
||||
author: "Citinited"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Boo affects APCs again"
|
||||
- bugfix: "Boo no longer fully charges when you enter your corpse"
|
||||
@@ -0,0 +1,5 @@
|
||||
author: "Arkatos"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Blob split consciousness ability now requires you to directly target a node you want to turn into another sentient overmind instead of selecting a nearest one"
|
||||
- spellcheck: "Fixed and improved some descriptions regarding Blob offspring"
|
||||
@@ -0,0 +1,5 @@
|
||||
author: "dovydas12345"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Fixes cryopod removing ambulance, secway keys"
|
||||
- bugfix: "Fixes cryopod recovering the invisible headpocket item"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Ty-Omaha"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Changed admin take ticket color from neon green to Asay pink"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Couls"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "t-t-t-typo!"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Shadeykins"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Fixes rogue pixels on breath masks/gas masks for Plasmamen."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Christasmurf"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Fixes a random pixel on the leather shoes"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "uc_guy"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Fixed \"Venus Human Traps\" being invisible."
|
||||
@@ -0,0 +1,5 @@
|
||||
author: "Arkatos"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Changelings should now correctly receive their action buttons"
|
||||
- bugfix: "Changelings now do not steal action buttons from other changelings"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 297 KiB After Width: | Height: | Size: 298 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
Reference in New Issue
Block a user