Matt's Bugfix Galore (#9816)

This commit is contained in:
Matt Atlas
2020-08-29 16:24:10 +02:00
committed by GitHub
parent 7e4db0b830
commit 5d875f9bb5
40 changed files with 168 additions and 136 deletions
@@ -1,38 +0,0 @@
/datum/admin_secret_item/admin_secret/prison_warp
name = "Prison Warp"
/datum/admin_secret_item/admin_secret/prison_warp/can_execute(var/mob/user)
if(!ROUND_IS_STARTED) return 0
return ..()
/datum/admin_secret_item/admin_secret/prison_warp/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/mob/living/carbon/human/H in mob_list)
var/turf/T = get_turf(H)
var/security = 0
if((T && isAdminLevel(T.z)) || prisonwarped.Find(H))
//don't warp them if they aren't ready or are already there
continue
H.Paralyse(5)
if(H.wear_id)
var/obj/item/card/id/id = H.get_idcard()
for(var/A in id.access)
if(A == access_security)
security++
if(!security)
//strip their stuff before they teleport into a cell :downs:
for(var/obj/item/W in H)
if(istype(W, /obj/item/organ/external))
continue
//don't strip organs
H.drop_from_inventory(W)
//teleport person to cell
H.forceMove(pick(prisonwarp))
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
else
//teleport security person
H.forceMove(pick(prisonsecuritywarp))
prisonwarped += H
@@ -37,6 +37,9 @@
if(mob_name_suffix)
pick_message = "[pick_message] Auto Suffix: \"[mob_name_suffix]\" "
mname = sanitizeSafe(input(user, pick_message, "Name for a [species] (without prefix/suffix)"))
if(!mname)
mname = pick(last_names)
if(mob_name_prefix)
mname = replacetext(mname,mob_name_prefix,"") //Remove the prefix if it exists in the string
+1 -1
View File
@@ -44,7 +44,7 @@
/mob/living/heavy_vehicle/get_cell()
RETURN_TYPE(/obj/item/cell)
return body.cell
return body?.cell
/mob/living/heavy_vehicle/proc/calc_power_draw()
var/total_draw = 0
+5 -5
View File
@@ -6,7 +6,7 @@
anchored = 1
icon_state = "wreck"
icon = 'icons/mecha/mech_part_items.dmi'
var/prepared
var/prepared = FALSE
/obj/structure/mech_wreckage/Initialize(var/newloc, var/mob/living/heavy_vehicle/exosuit, var/gibbed)
if(exosuit)
@@ -37,14 +37,14 @@
return ..()
/obj/structure/mech_wreckage/attackby(var/obj/item/W, var/mob/user)
var/cutting
if(iswelder(W))
if(W.iswelder())
var/obj/item/weldingtool/WT = W
if(WT.isOn())
cutting = TRUE
else
to_chat(user, "<span class='warning'>Turn the torch on, first.</span>")
return
else if(istype(W, /obj/item/gun/energy/plasmacutter))
cutting = TRUE
@@ -56,7 +56,7 @@
to_chat(user, "<span class='warning'>\The [src] has already been weakened.</span>")
return 1
else if(iswrench(W))
else if(W.iswrench())
if(prepared)
to_chat(user, "<span class='notice'>You finish dismantling \the [src].</span>")
new /obj/item/stack/material/steel(get_turf(src),rand(5,10))
@@ -78,4 +78,4 @@
thing.forceMove(get_turf(src))
else
qdel(thing)
..()
return ..()
+1 -1
View File
@@ -400,7 +400,7 @@
return
/material/diona/place_dismantled_girder(var/turf/target)
spawn_diona_nymph(target)
target.spawn_diona_nymph(target)
/material/steel/holographic
name = "holo" + DEFAULT_WALL_MATERIAL
+10 -7
View File
@@ -58,12 +58,8 @@
if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it.
src.visible_message("<b>\The [src.name]</b> [deathmessage]", range = messagerange)
// If we have a remotely controlled mob, we come back to our body to die properly
if(vr_mob)
vr_mob.body_return()
// Alternatively, if we are the remotely controlled mob, just kick our controller out
if(old_mob)
body_return()
exit_vr()
stat = DEAD
update_canmove()
@@ -105,5 +101,12 @@
if(SSticker.mode)
SSticker.mode.check_win()
return 1
/mob/proc/exit_vr()
// If we have a remotely controlled mob, we come back to our body to die properly
if(vr_mob)
vr_mob.body_return()
// Alternatively, if we are the remotely controlled mob, just kick our controller out
if(old_mob)
body_return()
+2 -1
View File
@@ -27,7 +27,8 @@
//Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
var/locked = 0
var/locked = FALSE
var/can_be_ipc = FALSE
var/mob/living/carbon/brain/brainmob = null//The current occupant.
var/obj/item/organ/internal/brain/brainobj = null //The current brain organ.
@@ -5,9 +5,10 @@
icon_state = "posibrain"
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4)
var/searching = FALSE
req_access = list(access_robotics)
locked = FALSE
can_be_ipc = TRUE
var/searching = FALSE
/obj/item/device/mmi/digital/posibrain/Initialize()
. = ..()
@@ -1,5 +1,6 @@
/mob/living/carbon/
/mob/living/carbon
gender = MALE
accent = ACCENT_CETI
var/datum/species/species //Contains icon generation and language information, set during New().
//stomach contents redefined at mob/living level, removed from here
@@ -1311,7 +1311,7 @@
if(istype(M))
if(!blood_DNA[M.dna.unique_enzymes])
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
hand_blood_color = blood_color
hand_blood_color = species.blood_color
src.update_inv_gloves() //handles bloody hands overlays and updating
verbs += /mob/living/carbon/human/proc/bloody_doodle
return 1 //we applied blood to the item
@@ -472,7 +472,9 @@
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
user.do_attack_animation(src)
var/dam_zone = pick(organs_by_name)
var/dam_zone = user.zone_sel?.selecting
if(!dam_zone)
dam_zone = pick(organs)
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
@@ -47,6 +47,8 @@ emp_act
var/armor = getarmor_organ(organ, "bullet")
if(prob(20 + max(P.damage - armor, -10)))
var/obj/item/SP = new P.shrapnel_type()
SP.edge = TRUE
SP.sharp = TRUE
SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel"
SP.desc = "[SP.desc] It looks like it was fired from [P.shot_from]."
SP.forceMove(organ)
@@ -25,7 +25,6 @@
has_organ = list()
siemens_coefficient = 0
rarity_value = 10
virus_immune = 1
breakcuffs = list(MALE,FEMALE,NEUTER)
@@ -35,8 +35,6 @@
reagent_tag = IS_UNDEAD
virus_immune = TRUE
rarity_value = 10
blurb = "Skeletons are undead brought back to life through dark wizardry, \
they are empty shells fueled by sheer obscure power and blood-magic. \
@@ -106,13 +104,11 @@
icobase = 'icons/mob/human_races/r_manifested.dmi'
deform = 'icons/mob/human_races/r_manifested.dmi'
default_language = "Ceti Basic"
language = "Cult"
name_language = "Cult"
default_language = LANGUAGE_TCB
language = LANGUAGE_CULT
name_language = LANGUAGE_CULT
has_organ = list()
virus_immune = 1
reagent_tag = IS_UNDEAD
rarity_value = 10
@@ -186,8 +182,6 @@
BP_STOMACH = /obj/item/organ/internal/stomach
)
virus_immune = 1
vision_flags = DEFAULT_SIGHT | SEE_MOBS
reagent_tag = IS_UNDEAD
@@ -38,7 +38,6 @@
eyes = "vox_eyes_s"
gluttonous = 2
virus_immune = 1
breath_type = GAS_NITROGEN
poison_type = GAS_OXYGEN
@@ -45,7 +45,6 @@
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/mob_size = MOB_MEDIUM
var/show_ssd = "fast asleep"
var/virus_immune
var/short_sighted
var/bald = 0
var/light_range
@@ -44,7 +44,6 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
brute_mod = 2
burn_mod = 4
virus_immune = 1
grab_mod = 2
resist_mod = 2
@@ -76,7 +76,6 @@
blood_color = COLOR_IPC_BLOOD
flesh_color = "#575757"
virus_immune = 1
reagent_tag = IS_MACHINE
has_organ = list(
@@ -233,7 +233,6 @@
appearance_flags = HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_SOCKS
vision_flags = DEFAULT_SIGHT | SEE_MOBS
virus_immune = 1
reagent_tag = IS_MACHINE
inherent_verbs = list(
@@ -13,7 +13,6 @@
siemens_coefficient = 3 //conductive
darksight = 3
rarity_value = 5
virus_immune = 1
fall_mod = 0
grab_mod = 1.5
resist_mod = 0.25
+23 -23
View File
@@ -161,30 +161,30 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
attack(mob/living/carbon/slime/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime.
to_chat(user, SPAN_WARNING("The potion only works on slimes!"))
return ..()
if(M.stat)
to_chat(user, SPAN_WARNING("The slime is dead!"))
return ..()
if(M.mind)
to_chat(user, SPAN_WARNING("The slime resists!"))
return ..()
var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc)
pet.icon_state = "[M.colour] adult slime"
pet.icon_living = "[M.colour] adult slime"
pet.icon_dead = "[M.colour] baby slime dead"
pet.colour = "[M.colour]"
to_chat(user, "You feed the slime the potion, removing it's powers and calming it.")
qdel(M)
var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN)
/obj/item/slimepotion2/attack(mob/living/carbon/slime/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime.
to_chat(user, SPAN_WARNING("The potion only works on slimes!"))
return ..()
if(M.stat)
to_chat(user, SPAN_WARNING("The slime is dead!"))
return ..()
if(M.mind)
to_chat(user, SPAN_WARNING("The slime resists!"))
return ..()
var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc)
pet.icon_state = "[M.colour] adult slime"
pet.icon_living = "[M.colour] adult slime"
pet.icon_dead = "[M.colour] baby slime dead"
pet.colour = "[M.colour]"
to_chat(user, "You feed the slime the potion, removing it's powers and calming it.")
qdel(M)
var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN)
if(!newname)
newname = "pet slime"
pet.name = newname
pet.real_name = newname
qdel(src)
if(!newname)
newname = "pet slime"
pet.name = newname
pet.real_name = newname
qdel(src)
/obj/item/slimesteroid
name = "slime steroid"
+3 -2
View File
@@ -740,11 +740,12 @@ var/list/ai_verbs_default = list(
else if(W.iswrench())
if(anchored)
user.visible_message("<span class='notice'>\The [user] starts to unbolt \the [src] from the plating...</span>")
if(!do_after(user,40/W.toolspeed))
if(!do_after(user, 40/W.toolspeed))
user.visible_message("<span class='notice'>\The [user] decides not to unbolt \the [src].</span>")
return
user.visible_message("<span class='notice'>\The [user] finishes unfastening \the [src]!</span>")
anchored = 0
anchored = FALSE
exit_vr()
return
else
user.visible_message("<span class='notice'>\The [user] starts to bolt \the [src] to the plating.</span>..")
@@ -232,6 +232,8 @@
/obj/item/computer_hardware,
/obj/item/slimesteroid,
/obj/item/slimesteroid2,
/obj/item/slimepotion,
/obj/item/slimepotion2,
/obj/item/remote_mecha
)
@@ -250,6 +250,10 @@
to_chat(user, SPAN_WARNING("\The [W] does not seem to fit. (The player lacks the appropriate whitelist.)"))
return
if(!M.can_be_ipc)
to_chat(user, SPAN_WARNING("There's no way that would fit in an IPC chassis!"))
return
var/mob/living/carbon/human/new_shell = new(get_turf(src), chest.linked_frame)
forceMove(new_shell) //so people won't mess around with the chassis until it is deleted
M.brainmob.mind.transfer_to(new_shell)
@@ -25,15 +25,18 @@
if(usr.stat || usr.restrained())
return
src.flipped = !src.flipped
if(src.flipped)
src.item_state = "[item_state]_alt"
flipped = !flipped
if(flipped)
overlay_state = "[item_state]_alt"
item_state = "[item_state]_alt"
else
src.item_state = initial(item_state)
to_chat(usr, "You change \the [src] to be on your [src.flipped ? "left" : "right"] hand.")
if(ismob(src.loc))
item_state = initial(item_state)
overlay_state = initial(overlay_state)
to_chat(usr, SPAN_NOTICE("You change \the [src] to be on your [src.flipped ? "left" : "right"] hand."))
if(ismob(loc))
var/mob/M = src.loc
M.update_inv_gloves()
M.update_inv_wear_id()
/obj/item/modular_computer/CouldUseTopic(var/mob/user)
..()
+2 -3
View File
@@ -1038,10 +1038,9 @@ Note that amputating the affected organ does in fact remove the infection from t
if(company)
model = company
var/datum/robolimb/R = all_robolimbs[company]
/*if(species && !(species.name in R.species_can_use && species.get_bodytype() != BODYTYPE_IPC))
R = basic_robolimb*/
if(R)
if (!force_skintone)
if(!force_skintone)
force_icon = R.icon
if(R.lifelike)
status |= ORGAN_LIFELIKE
+8 -1
View File
@@ -20,6 +20,8 @@
var/datum/robolimb/R = all_robolimbs[robotize_type]
if(R.paintable)
limb_exception = TRUE
if(R.company == PROSTHETIC_SYNTHSKIN)
limb_exception = TRUE
if(status & ORGAN_ROBOT && !(isipc(human)) && !limb_exception)
return
if(species && human.species && species.name != human.species.name)
@@ -142,8 +144,13 @@
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
if(painted && skin_color)
if((painted && skin_color) || robotize_type == PROSTHETIC_SYNTHSKIN)
mob_icon.Blend(skin_color, ICON_ADD)
if(!isnull(s_tone))
if(s_tone >= 0)
mob_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
mob_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
apply_markings(restrict_to_robotic = TRUE)
get_internal_organs_overlay()
else
+12 -14
View File
@@ -1,22 +1,19 @@
/proc/spawn_diona_nymph(var/turf/target)
if(!istype(target))
return 0
/turf/proc/spawn_diona_nymph()
//This is a terrible hack and I should be ashamed.
var/datum/seed/diona = SSplants.seeds["diona"]
if(!diona)
return 0
spawn(1) // So it has time to be thrown about by the gib() proc.
var/mob/living/carbon/alien/diona/D = new(target)
var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
P.request_player(D, "A diona nymph has split off from its gestalt. ")
spawn(60)
if(D)
if(!D.ckey || !D.client)
D.death()
return 1
INVOKE_ASYNC(src, .proc/create_diona_nymph)
/turf/proc/create_diona_nymph()
var/mob/living/carbon/alien/diona/D = new(src)
var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
P.request_player(D, "A diona nymph has split off from its gestalt. ")
sleep(120)
if(D)
if(!D.ckey || !D.client)
D.death()
//Probable future TODO: Refactor diona organs to be /obj/item/organ/external/bodypart/diona
//Having them not inherit from specific bodypart classes is a problem
@@ -27,7 +24,8 @@
/obj/item/organ/external/diona/removed(var/mob/living/user)
..()
if(spawn_diona_nymph(get_turf(src)))
var/turf/T = get_turf(src)
if(T.spawn_diona_nymph())
qdel(src)
/obj/item/organ/external/chest/diona
@@ -99,7 +99,7 @@ obj/item/gun/energy/staff/animate/special_check(var/mob/living/user)
return 0
return 1
obj/item/gun/energy/staff/focus
/obj/item/gun/energy/staff/focus
name = "mental focus"
desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out."
icon = 'icons/obj/guns/mental_focus.dmi'
@@ -114,7 +114,7 @@ obj/item/gun/energy/staff/focus/special_check(var/mob/living/user)
to_chat(user, "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>")
return 0
if(!user.is_wizard())
if(istype(user, /mob/living/carbon/human))
if(ishuman(user))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ(BP_L_ARM)
@@ -17,9 +17,6 @@
return 1
/obj/item/projectile/forcebolt/strong/on_hit(var/atom/target, var/blocked = 0)
// var/throwdir = null
for(var/mob/M in hearers(2, src))
if(M.loc != src.loc)
var/throwdir = get_dir(firer,target)
+4 -2
View File
@@ -59,7 +59,9 @@
user.visible_message("<span class='notice'>\ [user] slices through the skin of \the [src], revealing a confused diona nymph.</span>")
else
return
spawn_diona_nymph(src.loc)
if(isturf(loc))
var/turf/T = loc
T.spawn_diona_nymph()
qdel(src)
/obj/structure/diona/bulb/unpowered
@@ -185,7 +187,7 @@
if(ARTIFACT_CHAR)
new /obj/structure/diona/bulb(T)
if(MONSTER_CHAR)
spawn_diona_nymph(T)
T.spawn_diona_nymph()
if(DOOR_CHAR)
var/obj/structure/diona/vines/V = new(T)
V.growth = 3