Merge branch 'master' into call-it-whatever-the-fuck-i-want

This commit is contained in:
Dahlular
2020-06-09 20:54:12 -06:00
committed by GitHub
120 changed files with 6433 additions and 178836 deletions
+6 -4
View File
@@ -203,16 +203,18 @@
name = "CentCom Commander"
uniform = /obj/item/clothing/under/rank/centcom_commander
suit = /obj/item/clothing/suit/armor/bulletproof
suit = /obj/item/clothing/suit/hooded/wintercoat/centcom
shoes = /obj/item/clothing/shoes/combat/swat
gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/radio/headset/headset_cent/commander
glasses = /obj/item/clothing/glasses/eyepatch
glasses = /obj/item/clothing/glasses/thermal/eyepatch
mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
head = /obj/item/clothing/head/centhat
belt = /obj/item/gun/ballistic/revolver/mateba
neck = /obj/item/clothing/neck/cloak/centcom
belt = /obj/item/gun/ballistic/automatic/pistol/lato
r_pocket = /obj/item/lighter
l_pocket = /obj/item/ammo_box/a357
l_pocket = /obj/item/ammo_box/magazine/latomag
l_hand = /obj/item/ammo_box/magazine/latomag
back = /obj/item/storage/backpack/satchel/leather
id = /obj/item/card/id
+5 -4
View File
@@ -14,19 +14,20 @@
icon_state = "DS-magboots0"
magboot_state = "DS-magboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
alternate_worn_icon = 'icons/mob/feet.dmi'
slowdown_active = SHOES_SLOWDOWN
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/shoes/magboots/atmos
desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle. These are painted in the colors of an atmospheric technician."
name = "atmospherics magboots"
icon_state = "atmosmagboots0"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
alternate_worn_icon = 'icons/mob/feet.dmi'
magboot_state = "atmosmagboots"
resistance_flags = FIRE_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/shoes/simonshoes
name = "Simon's Shoes"
+7
View File
@@ -55,6 +55,13 @@
desc = "Worn by the Head of Personnel. It smells faintly of bureaucracy."
icon_state = "hopcloak"
/obj/item/clothing/neck/cloak/centcom
name = "central command's cloak"
desc = "Worn by High-Ranking Central Command Personnel. I guess they needed one too."
icon_state = "centcomcloak"
armor = list("melee" = 35, "bullet" = 40, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 20, "rad" = 20, "fire" = 60, "acid" = 60)
body_parts_covered = CHEST|GROIN|ARMS
/obj/item/clothing/suit/hooded/cloak/goliath
name = "goliath cloak"
icon_state = "goliath_cloak"
+2 -2
View File
@@ -114,13 +114,13 @@
can_adjust = FALSE
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
name = "\improper CentCom officer's jumpsuit, adorned with a golden K and a star. This is not Nanotrasen."
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders, adorned with a golden K and a star. This is not Nanotrasen."
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
+2 -2
View File
@@ -1,8 +1,8 @@
/datum/round_event_control/carp_migration
name = "Carp Migration"
typepath = /datum/round_event/carp_migration
weight = 15
min_players = 2
weight = 10 //decreased weight from 15 to 10
min_players = 5 //increased min players from 2 to 5 to reduce chances of half the crew dying in a carp breach
earliest_start = 10 MINUTES
max_occurrences = 6
@@ -80,6 +80,9 @@ God bless America.
I.reagents.trans_to(src, I.reagents.total_volume)
qdel(I)
return
if(istype(I,/obj/item/clothing/head/mob_holder))
to_chat(user, "<span class='warning'>This does not fit in the fryer.</span>") // TODO: Deepfrying instakills mobs, spawns a whole deep-fried mob.
return
if(!reagents.has_reagent("cooking_oil"))
to_chat(user, "<span class='warning'>[src] has no cooking oil to fry with!</span>")
return
+13 -14
View File
@@ -187,7 +187,6 @@
throw_range = 5
w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
resistance_flags = FLAMMABLE
var/dat //Actual page content
var/due_date = 0 //Game time in 1/10th seconds
var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
@@ -200,28 +199,28 @@
to_chat(user, "<span class='warning'>As you are trying to read, you suddenly feel very stupid!</span>")
return
if(ismonkey(user))
to_chat(user, "<span class='notice'>You skim through the book but can't comprehend any of it.</span>")
to_chat(user, "<span class='notice'>You skim through the datapad but can't comprehend any of it.</span>")
return
if(dat)
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
user << browse("<TT><I>Created by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
user.visible_message("[user] begins reading a datapad titled \"[title]\" intently.")
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
onclose(user, "book")
else
to_chat(user, "<span class='notice'>This book is completely blank!</span>")
to_chat(user, "<span class='notice'>This datapad is completely blank!</span>")
/obj/item/book/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pen))
if(is_blind(user))
to_chat(user, "<span class='warning'> As you are trying to write on the book, you suddenly feel very stupid!</span>")
to_chat(user, "<span class='warning'> As you are trying to edit the datapad, you suddenly feel very stupid!</span>")
return
if(unique)
to_chat(user, "<span class='warning'>These pages don't seem to take the ink well! Looks like you can't modify it.</span>")
to_chat(user, "<span class='warning'>These entries don't seem to be editable! Looks like you can't modify it.</span>")
return
var/literate = user.is_literate()
if(!literate)
to_chat(user, "<span class='notice'>You scribble illegibly on the cover of [src]!</span>")
to_chat(user, "<span class='notice'>You enter illegible text on the cover page of [src]!</span>")
return
var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
if(!user.canUseTopic(src, BE_CLOSE, literate))
@@ -232,7 +231,7 @@
if(!user.canUseTopic(src, BE_CLOSE, literate))
return
if (length(newtitle) > 20)
to_chat(user, "That title won't fit on the cover!")
to_chat(user, "That title is too large for the datapad's memory!")
return
if(!newtitle)
to_chat(user, "That title is invalid.")
@@ -241,7 +240,7 @@
name = newtitle
title = newtitle
if("Contents")
var/content = stripped_input(user, "Write your book's contents (HTML NOT allowed):","","",8192)
var/content = stripped_input(user, "Write your datapad's contents (HTML NOT allowed):","","",8192)
if(!user.canUseTopic(src, BE_CLOSE, literate))
return
if(!content)
@@ -250,7 +249,7 @@
else
dat += content
if("Author")
var/newauthor = stripped_input(user, "Write the author's name:")
var/newauthor = stripped_input(user, "Enter the author's name:")
if(!user.canUseTopic(src, BE_CLOSE, literate))
return
if(!newauthor)
@@ -291,10 +290,10 @@
scanner.computer.inventory.Add(src)
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters))
to_chat(user, "<span class='notice'>You begin to carve out [title]...</span>")
else if(istype(I, /obj/item/multitool))
to_chat(user, "<span class='notice'>You begin to erase the data from [title] with your PDA!...</span>")
if(do_after(user, 30, target = src))
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
to_chat(user, "<span class='notice'>You erase all the page data from [title] with your PDA! You didn't want to read it anyway.</span>")
var/obj/item/storage/book/B = new
B.name = src.name
B.title = src.title
+28 -13
View File
@@ -159,22 +159,35 @@
return
//END OF CIT CHANGES
var/atom/movable/thrown_thing
var/obj/item/I = src.get_active_held_item()
if(!I)
if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
var/mob/living/throwable_mob = pulling
if(!throwable_mob.buckled)
thrown_thing = throwable_mob
var/atom/movable/thrown_thing
var/mob/living/throwable_mob
if(istype(I, /obj/item/clothing/head/mob_holder))
var/obj/item/clothing/head/mob_holder/holder = I
if(holder.held_mob)
throwable_mob = holder.held_mob
holder.release()
if(!I || throwable_mob)
if(!throwable_mob && pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
throwable_mob = pulling
if(throwable_mob && !throwable_mob.buckled)
thrown_thing = throwable_mob
if(pulling)
stop_pulling()
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
if(start_T && end_T)
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
return
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
if(start_T && end_T)
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
thrown_thing = I
@@ -194,6 +207,8 @@
newtonian_move(get_dir(target, src))
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
/mob/living/carbon/restrained(ignore_grab)
. = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
@@ -282,10 +282,17 @@
else if(check_zone(M.zone_selected) == "head")
var/mob/living/carbon/human/H = src
var/datum/species/pref_species = H.dna.species
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better!</span>", \
if(HAS_TRAIT(H, TRAIT_HEADPAT_SLUT))
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better! They seem incredibly pleased!</span>", \
"<span class='notice'>You give [H] a pat on the head to make [p_them()] feel better! They seem to like it way too much</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "lewd_headpat", /datum/mood_event/lewd_headpat)
H.adjustArousalLoss(5) //Headpats are hot af
else
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better!</span>", \
"<span class='notice'>You give [H] a pat on the head to make [p_them()] feel better!</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if (mood.sanity >= SANITY_GREAT)
@@ -16,6 +16,10 @@
msg += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face.\n"
if (wear_neck)
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
if(can_be_held)
msg += "[t_He] looks small enough to be picked up with <b>Alt+Click</b>!\n"
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
@@ -107,6 +107,10 @@
//Status effects
msg += status_effect_examines()
//Can be picked up?
if(can_be_held)
msg += "[t_He] looks small enough to be picked up with <b>Alt+Click</b>!\n"
//CIT CHANGES START HERE - adds genital details to examine text
if(LAZYLEN(internal_organs))
for(var/obj/item/organ/genital/dicc in internal_organs)
@@ -1098,4 +1098,10 @@
race = /datum/species/zombie/infectious
/mob/living/carbon/human/species/zombie/krokodil_addict
race = /datum/species/krokodil_addict
race = /datum/species/krokodil_addict
//define holder_type on nerds we wanna commit scoop to
/mob/living/carbon/human
var/holder_type = /obj/item/clothing/head/mob_holder/micro
can_be_held = "micro"
@@ -65,3 +65,5 @@
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
var/lastpuke = 0
var/last_fire_update
can_be_held = "micro"
@@ -132,6 +132,10 @@
pickupTarget = null
pickupTimer = 0
else if(ismob(pickupTarget.loc)) // in someones hand
if(istype(pickupTarget, /obj/item/clothing/head/mob_holder/))
var/obj/item/clothing/head/mob_holder/h = pickupTarget
if(h && h.held_mob==src)
return//dont let them pickpocket themselves
var/mob/M = pickupTarget.loc
if(!pickpocketing)
pickpocketing = TRUE
@@ -15,6 +15,7 @@
bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey,
/obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
hud_type = /datum/hud/monkey
can_be_held = "monkey"
/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
verbs += /mob/living/proc/mob_sleep
@@ -45,6 +46,10 @@
SSmobs.cubemonkeys -= src
return ..()
/mob/living/carbon/monkey/generate_mob_holder()
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "monkey", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE)
return holder
/mob/living/carbon/monkey/create_internal_organs()
internal_organs += new /obj/item/organ/appendix
internal_organs += new /obj/item/organ/lungs
@@ -1,4 +1,3 @@
/mob/living/carbon/monkey/regenerate_icons()
if(!..())
update_body_parts()
@@ -77,4 +76,4 @@
/mob/living/carbon/monkey/update_hud_back(obj/item/I)
if(client && hud_used && hud_used.hud_shown)
I.screen_loc = ui_monkey_back
client.screen += I
client.screen += I
+49 -1
View File
@@ -10,10 +10,29 @@
ntransform.TurnTo(lying_prev,lying)
if(lying == 0) //Lying to standing
final_pixel_y = get_standard_pixel_y_offset()
if(size_multiplier >= 1) //if its bigger than normal
ntransform.Translate(0,16 * (size_multiplier-1))
else
if(lying_prev == 90)
ntransform.Translate(16 * (size_multiplier-1),16 * (size_multiplier-1))
if(lying_prev == 270)
ntransform.Translate(-16 * (size_multiplier-1),16 * (size_multiplier-1))
else //if(lying != 0)
if(lying_prev == 0) //Standing to lying
pixel_y = get_standard_pixel_y_offset()
final_pixel_y = get_standard_pixel_y_offset(lying)
if(lying == 90) //Check the angle of the sprite to offset it accordingly.
ntransform.Translate(-16 * (size_multiplier-1),0)
if(size_multiplier < 1) //if its smaller than normal
ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards
if(lying == 270) //check the angle of the sprite to offset it accordingly
ntransform.Translate(16 * (size_multiplier-1),0)
if(size_multiplier < 1) //if its smaller than normal
ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards
if(dir & (EAST|WEST)) //Facing east or west
final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass
@@ -22,11 +41,40 @@
ntransform.Scale(resize)
resize = RESIZE_DEFAULT_SIZE
//Apply size multiplier, thank NeverExisted for this
if(size_multiplier != previous_size)
changed++
//now we offset the sprite
//Scaling affects offset. There's probably a smarter and easier way to do this, but this way it works for sure (?)
//Just to be clear. All this bullshit is needed because someone wanted to store the old transform matrix instead of using a new one each iteration
//Winfre is currently doing a great job at coating my nuts in slobber while i code this
if(!lying) //when standing. People of all sizes are affected equally
ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly.
ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
else //when lying. Macros dont get an offset, Micros do. We must also check the cases when a micro becomes a macro and viceversa
if(previous_size <= 1 && size_multiplier <= 1) //micro stays a micro. We modify the side-offset
ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
if(previous_size <= 1 && size_multiplier > 1) //micro becomes a macro. We remove the side-offset
ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
if(previous_size > 1 && size_multiplier <= 1) //macro becomes a micro. We add an offset
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly.
ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
if(previous_size > 1 && size_multiplier > 1) //macro stays a macro. We just scale the sprite with no offset changes
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
previous_size = size_multiplier
if(changed)
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
/mob/living/carbon
var/list/overlays_standing[TOTAL_LAYERS]
+95 -50
View File
@@ -5,80 +5,125 @@
desc = "Yell at coderbrush."
icon = null
icon_state = ""
item_flags = DROPDEL
var/mob/living/held_mob
var/can_head = TRUE
var/destroying = FALSE
var/can_head = FALSE
w_class = WEIGHT_CLASS_BULKY
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, head_icon, lh_icon, rh_icon, _can_head = TRUE)
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, alt_worn, lh_icon, rh_icon, _can_head_override = FALSE)
. = ..()
can_head = _can_head
if(head_icon)
alternate_worn_icon = head_icon
if(M)
M.setDir(SOUTH)
held_mob = M
M.forceMove(src)
appearance = M.appearance
name = M.name
desc = M.desc
if(_can_head_override)
can_head = _can_head_override
if(alt_worn)
alternate_worn_icon = alt_worn
if(_worn_state)
item_state = _worn_state
icon_state = _worn_state
if(lh_icon)
lefthand_file = lh_icon
if(rh_icon)
righthand_file = rh_icon
if(!can_head)
slot_flags = NONE
deposit(M)
/obj/item/clothing/head/mob_holder/Destroy()
destroying = TRUE
if(held_mob)
release(FALSE)
release()
return ..()
/obj/item/clothing/head/mob_holder/proc/deposit(mob/living/L)
if(!istype(L))
return FALSE
L.setDir(SOUTH)
update_visuals(L)
held_mob = L
L.forceMove(src)
name = L.name
desc = L.desc
return TRUE
/obj/item/clothing/head/mob_holder/dropped()
..()
if(isturf(loc))//don't release on soft-drops
release()
/obj/item/clothing/head/mob_holder/proc/update_visuals(mob/living/L)
appearance = L.appearance
/obj/item/clothing/head/mob_holder/proc/release(del_on_release = TRUE)
if(!held_mob)
if(del_on_release && !destroying)
qdel(src)
return FALSE
/obj/item/clothing/head/mob_holder/proc/release()
if(isliving(loc))
var/mob/living/L = loc
to_chat(L, "<span class='warning'>[held_mob] wriggles free!</span>")
L.dropItemToGround(src)
held_mob.forceMove(get_turf(held_mob))
held_mob.reset_perspective()
held_mob.setDir(SOUTH)
held_mob.visible_message("<span class='warning'>[held_mob] uncurls!</span>")
held_mob = null
if(del_on_release && !destroying)
qdel(src)
return TRUE
if(held_mob)
var/mob/living/m = held_mob
m.forceMove(get_turf(m))
m.reset_perspective()
m.setDir(SOUTH)
held_mob = null
qdel(src)
/obj/item/clothing/head/mob_holder/relaymove(mob/user)
release()
return
/obj/item/clothing/head/mob_holder/container_resist()
if(isliving(loc))
var/mob/living/L = loc
visible_message("<span class='warning'>[src] escapes [L]!</span>")
release()
/obj/item/clothing/head/mob_holder/drone/deposit(mob/living/L)
. = ..()
if(!isdrone(L))
qdel(src)
name = "drone (hiding)"
desc = "This drone is scared and has curled up into a ball!"
/mob/living/proc/mob_pickup(mob/living/L)
var/obj/item/clothing/head/mob_holder/holder = generate_mob_holder()
if(!holder)
return
drop_all_held_items()
L.put_in_hands(holder)
return
/obj/item/clothing/head/mob_holder/drone/update_visuals(mob/living/L)
var/mob/living/simple_animal/drone/D = L
if(!D)
return ..()
icon = 'icons/mob/drone.dmi'
icon_state = "[D.visualAppearence]_hat"
/mob/living/proc/mob_try_pickup(mob/living/user)
if(!ishuman(user) || !src.Adjacent(user) || user.incapacitated() || !can_be_held)
return FALSE
if(src.can_be_held == "micro")
return FALSE
if(user.get_active_held_item())
to_chat(user, "<span class='warning'>Your hands are full!</span>")
return FALSE
if(buckled)
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
return FALSE
if(src == user)
to_chat(user, "<span class='warning'>You can't pick yourself up.</span>")
return FALSE
visible_message("<span class='warning'>[user] starts picking up [src].</span>", \
"<span class='userdanger'>[user] starts picking you up!</span>")
if(!do_after(user, 20, target = src))
return FALSE
if(user.get_active_held_item()||buckled)
return FALSE
visible_message("<span class='warning'>[user] picks up [src]!</span>", \
"<span class='userdanger'>[user] picks you up!</span>")
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
mob_pickup(user)
return TRUE
/mob/living/AltClick(mob/user)
. = ..()
if(mob_try_pickup(user))
return TRUE
/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env)
var/atom/location = loc
if(!loc)
return //null
var/turf/T = get_turf(loc)
while(location != T)
location = location.loc
if(ismob(location))
return location.loc.assume_air(env)
return location.assume_air(env)
/obj/item/clothing/head/mob_holder/remove_air(amount)
var/atom/location = loc
if(!loc)
return //null
var/turf/T = get_turf(loc)
while(location != T)
location = location.loc
if(ismob(location))
return location.loc.remove_air(amount)
return location.remove_air(amount)
+29 -18
View File
@@ -40,6 +40,15 @@
QDEL_LIST(diseases)
return ..()
/mob/living/proc/generate_mob_holder()
if(ishuman(src))
var/obj/item/clothing/head/mob_holder/micro/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi')
return holder
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi')
return holder
/mob/living/proc/OpenCraftingMenu()
return
@@ -136,6 +145,11 @@
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
mob_swap = 1
if(mob_swap)
//handle micro bumping on help intent
if(handle_micro_bump_helping(M))
return 1
//switch our position with M
if(loc && !loc.Adjacent(M.loc))
return 1
@@ -168,6 +182,11 @@
//not if he's not CANPUSH of course
if(!(M.status_flags & CANPUSH))
return 1
//handle micro bumping on other intents
if(handle_micro_bump_other(M))
return 1
if(isliving(M))
var/mob/living/L = M
if(HAS_TRAIT(L, TRAIT_PUSHIMMUNE))
@@ -281,7 +300,11 @@
var/datum/disease/D = thing
if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
p
if(iscarbon(L))
var/mob/living/carbon/C = L
if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER))
C.grippedby(src)
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
@@ -1124,23 +1147,6 @@ p
if(can_be_held)
mob_try_pickup(over)
/mob/living/proc/mob_pickup(mob/living/L)
return
/mob/living/proc/mob_try_pickup(mob/living/user)
if(!ishuman(user))
return
if(user.get_active_held_item())
to_chat(user, "<span class='warning'>Your hands are full!</span>")
return FALSE
if(buckled)
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
return FALSE
user.visible_message("<span class='notice'>[user] starts trying to scoop up [src]!</span>")
if(!do_after(user, 20, target = src))
return FALSE
mob_pickup(user)
return TRUE
/mob/living/proc/get_static_viruses() //used when creating blood and other infective objects
if(!LAZYLEN(diseases))
@@ -1236,3 +1242,8 @@ p
update_canmove()
for(var/chem in healing_chems)
reagents.add_reagent(chem, healing_chems[chem])
//retard edits below
/mob/living
var/size_multiplier = 1 //multiplier for the mob's icon size atm
var/previous_size = 1
+1 -1
View File
@@ -108,7 +108,7 @@
var/list/obj/effect/proc_holder/abilities = list()
var/can_be_held = FALSE //whether this can be picked up and held.
var/can_be_held = FALSE
var/radiation = 0 //If the mob is irradiated.
var/ventcrawl_layer = PIPING_LAYER_DEFAULT
@@ -31,6 +31,8 @@
var/mob/living/simple_animal/mouse/movement_target
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "cat"
can_be_held = "cat2"
size_multiplier = 0.5
do_footstep = TRUE
@@ -80,6 +82,7 @@
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
collar_type = "kitten"
can_be_held = "cat"
//RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/Runtime
@@ -262,6 +265,7 @@
attacked_sound = 'sound/items/eatfood.ogg'
deathmessage = "loses its false life and collapses!"
death_sound = "bodyfall"
can_be_held = "cak"
/mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts)
..()
@@ -13,8 +13,10 @@
see_in_dark = 5
speak_chance = 1
turns_per_move = 10
size_multiplier = 0.5
do_footstep = TRUE
can_be_held = TRUE
//Corgis and pugs are now under one dog subtype
@@ -35,6 +37,7 @@
var/obj/item/inventory_back
var/shaved = FALSE
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
can_be_held = "corgi"
/mob/living/simple_animal/pet/dog/corgi/Destroy()
QDEL_NULL(inventory_head)
@@ -63,6 +66,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3)
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "pug"
can_be_held = "pug"
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi
name = "Exotic Corgi"
@@ -360,6 +364,7 @@
icon_dead = "old_corgi_dead"
desc = "At a ripe old age of [record_age] Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
turns_per_move = 20
can_be_held = "old_corgi"
/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
@@ -582,6 +587,7 @@
unsuitable_atmos_damage = 0
minbodytemp = TCMB
maxbodytemp = T0C + 40
can_be_held = "void_puppy"
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
return 1 //Void puppies can navigate space.
@@ -603,6 +609,7 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/puppies = 0
can_be_held = "lisa"
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list)
@@ -274,3 +274,7 @@
/mob/living/simple_animal/drone/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
return 0 //So they don't die trying to fix wiring
/mob/living/simple_animal/drone/generate_mob_holder()
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "[visualAppearence]_hat", null, null, null, TRUE)
return holder
@@ -29,28 +29,11 @@
if("Nothing")
return
//ATTACK HAND IGNORING PARENT RETURN VALUE
//picky up the drone c:
/mob/living/simple_animal/drone/attack_hand(mob/user)
if(ishuman(user))
if(stat == DEAD || status_flags & GODMODE || !can_be_held)
..()
return
if(user.get_active_held_item())
to_chat(user, "<span class='warning'>Your hands are full!</span>")
return
visible_message("<span class='warning'>[user] starts picking up [src].</span>", \
"<span class='userdanger'>[user] starts picking you up!</span>")
if(!do_after(user, 20, target = src))
return
visible_message("<span class='warning'>[user] picks up [src]!</span>", \
"<span class='userdanger'>[user] picks you up!</span>")
if(buckled)
to_chat(user, "<span class='warning'>[src] is buckled to [buckled] and cannot be picked up!</span>")
return
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
drop_all_held_items()
var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src)
user.put_in_hands(DH)
..()
if(user.a_intent == INTENT_HELP)
mob_try_pickup(user)
/mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user)
var/mob/dead/observer/G = get_ghost()
@@ -18,7 +18,7 @@
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = FRIENDLY_SPAWN
can_be_held = "fox"
do_footstep = TRUE
//Captain fox
@@ -23,6 +23,8 @@
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption.
can_be_held = "lizard"
size_multiplier = 0.5
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
@@ -39,3 +41,7 @@
return TRUE
else
return ..()
/mob/living/simple_animal/hostile/lizard/generate_mob_holder()
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "lizard", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE)
return holder
@@ -25,6 +25,8 @@
var/body_color //brown, gray and white, leave blank for random
gold_core_spawnable = FRIENDLY_SPAWN
var/chew_probability = 1
can_be_held = TRUE
size_multiplier = 0.5
/mob/living/simple_animal/mouse/Initialize()
. = ..()
@@ -34,7 +36,7 @@
icon_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
can_be_held = "mouse_[body_color]"
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
@@ -87,14 +89,17 @@
/mob/living/simple_animal/mouse/white
body_color = "white"
icon_state = "mouse_white"
can_be_held = "mouse_white"
/mob/living/simple_animal/mouse/gray
body_color = "gray"
icon_state = "mouse_gray"
can_be_held = "mouse_gray"
/mob/living/simple_animal/mouse/brown
body_color = "brown"
icon_state = "mouse_brown"
can_be_held = "mouse_brown"
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom
@@ -118,3 +123,8 @@
/obj/item/reagent_containers/food/snacks/deadmouse/on_grind()
reagents.clear_reagents()
/mob/living/simple_animal/mouse/generate_mob_holder()
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi')
holder.w_class = WEIGHT_CLASS_TINY
return holder
@@ -22,7 +22,8 @@
maxHealth = 50
speed = 10
glide_size = 2
can_be_held = "sloth" //finally oranges can be held
size_multiplier = 0.5
do_footstep = TRUE
+4 -4
View File
@@ -11,7 +11,7 @@
* Pens
*/
/obj/item/pen
desc = "It's a normal black ink pen."
desc = "It's a black ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
name = "pen"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "pen"
@@ -33,12 +33,12 @@
return(BRUTELOSS)
/obj/item/pen/blue
desc = "It's a normal blue ink pen."
desc = "It's a blue ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
icon_state = "pen_blue"
colour = "blue"
/obj/item/pen/red
desc = "It's a normal red ink pen."
desc = "It's a red ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
icon_state = "pen_red"
colour = "red"
@@ -48,7 +48,7 @@
colour = "white"
/obj/item/pen/fourcolor
desc = "It's a fancy four-color ink pen, set to black."
desc = "It's a fancy four-color ink pen, set to black. Modified to be compatible with Nanotransen-brand Digital-Readpads™"
name = "four-color pen"
colour = "black"
+11 -3
View File
@@ -102,9 +102,17 @@
return ..()
/obj/machinery/disposal/proc/place_item_in_disposal(obj/item/I, mob/user)
I.forceMove(src)
user.visible_message("[user.name] places \the [I] into \the [src].", "<span class='notice'>You place \the [I] into \the [src].</span>")
if(istype(I, /obj/item/clothing/head/mob_holder))
var/obj/item/clothing/head/mob_holder/H = I
var/mob/living/m = H.held_mob
H.release()
if(m)
user.start_pulling(m, 1)
stuff_mob_in(m,user)
return//you don't want this going into disposals ever
if(user.temporarilyRemoveItemFromInventory(I)) //double-checks never hurt
I.forceMove(src)
user.visible_message("[user.name] places \the [I] into \the [src].", "<span class='notice'>You place \the [I] into \the [src].</span>")
//mouse drop another mob or self
/obj/machinery/disposal/MouseDrop_T(mob/living/target, mob/living/user)
if(istype(target))
@@ -11,7 +11,7 @@
var/cooldown_mod = 1
var/power_mod = 1
var/list/spans = list("colossus","yell")
var/speech_sound = 'sound/magic/clockwork/invoke_general.ogg'
var/invoke_sound = 'sound/magic/clockwork/invoke_general.ogg'
/obj/effect/proc_holder/spell/voice_of_god/can_cast(mob/user = usr)
if(!user.can_speak())
@@ -31,7 +31,7 @@
..()
/obj/effect/proc_holder/spell/voice_of_god/cast(list/targets, mob/user = usr)
playsound(get_turf(user), speech_sound, 300, 1, 5)
playsound(get_turf(user), invoke_sound, 300, 1, 5)
var/cooldown = voice_of_god(uppertext(command), user, spans, base_multiplier = power_mod)
charge_max = (cooldown * cooldown_mod)
@@ -41,4 +41,4 @@
power_mod = 0.1
cooldown_mod = 0.5
spans = list("clown")
speech_sound = 'sound/spookoween/scary_horn2.ogg'
invoke_sound = 'sound/spookoween/scary_horn2.ogg'
@@ -0,0 +1,78 @@
/datum/surgery/breast_augmentation
name = "Breast augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/augment_breasts, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
/datum/surgery_step/augment_breasts
name = "augment breasts"
implements = list(/obj/item/scalpel = 100, /obj/item/stack/sheet/plastic = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
/obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
time = 32
repeatable = TRUE
/datum/surgery_step/augment_breasts/tool_check(mob/user, obj/item/tool)
if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser))
return FALSE
return !tool.is_hot()
/datum/surgery_step/augment_breasts/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
//Patient has titties
if(target.has_breasts())
if(tool.is_sharp())
display_results(user, target, "<span class='notice'>You begin to cut the excess out of [target]'s breasts, bringing them down a cup size...</span>",
"[user] begins to augment [target]'s breasts.",
"[user] begins to augment [target]'s breasts.")
if(istype(tool, /obj/item/stack/sheet/plastic))
display_results(user, target, "<span class='notice'>You begin to mold, shape, and then add plastic to [target]'s breasts, increasing their cup size by 1...</span>",
"[user] begins to augment [target]'s breasts.",
"[user] begins to augment [target]'s breasts.")
//Patient does not have titties
else
if(istype(tool, /obj/item/stack/sheet/plastic))
display_results(user, target, "<span class='notice'>You begin to remodel [target]'s chest, creating a new pair of breasts which are barely A cups...</span>",
"[user] begins to perform plastic surgery on [target].",
"[user] begins to perform plastic surgery on [target].")
/datum/surgery_step/augment_breasts/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/genital/breasts/B = target.getorganslot("breasts")
//Patient has titties
if(B)
//Reduce their size (you fucking monster)
if(tool.is_sharp())
B.cached_size = B.cached_size - 1
B.update()
return 1
//Increase the size (that's more like it!)
if(istype(tool, /obj/item/stack/sheet/plastic))
var/obj/item/stack/sheet/plastic/pS = tool
pS.amount = pS.amount - 1
if(pS.amount < 1)
pS.Destroy()
B.cached_size = B.cached_size + 1
B.update()
return 1
//Patient does not have titties
else
//Give 'em titties
if(istype(tool, /obj/item/stack/sheet/plastic))
//Makes it so no one has any weird coloured tits
var/mob/living/carbon/human/H = target
if(H.dna.species.use_skintones)
H.dna.features["breasts_color"] = skintone2hex(H.skin_tone)
else
H.dna.features["breasts_color"] = H.dna.features["mcolor"]
var/obj/item/stack/sheet/plastic/pS = tool
pS.amount = pS.amount - 1
if(pS.amount < 1)
pS.Destroy()
var/obj/item/organ/genital/breasts/nB = new
nB.size = "flat"
nB.cached_size = 0
nB.prev_size = 0
nB.Insert(target)
nB.update()
return 1
@@ -0,0 +1,78 @@
/datum/surgery/penis_augmentation
name = "Penis augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/augment_penis, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_PRECISE_GROIN)
/datum/surgery_step/augment_penis
name = "augment penis"
implements = list(/obj/item/scalpel = 100, /obj/item/stack/sheet/plastic = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
/obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
time = 32
repeatable = TRUE
/datum/surgery_step/augment_penis/tool_check(mob/user, obj/item/tool)
if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser))
return FALSE
return !tool.is_hot()
/datum/surgery_step/augment_penis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
//Patient has a cock
if(target.has_penis())
if(tool.is_sharp())
display_results(user, target, "<span class='notice'>You begin to reshape [target]'s penis, decreasing it's length by an inch...</span>",
"[user] begins to augment [target]'s penis.",
"[user] begins to augment [target]'s penis.")
if(istype(tool, /obj/item/stack/sheet/plastic))
display_results(user, target, "<span class='notice'>You begin to mold, shape, and then add plastic to [target]'s penis, making it one inch bigger...</span>",
"[user] begins to augment [target]'s penis.",
"[user] begins to augment [target]'s penis.")
//Patient does not have a cock
else
if(istype(tool, /obj/item/stack/sheet/plastic))
display_results(user, target, "<span class='notice'>You begin to remodel [target]'s groin, creating a new penis of length 1 inch...</span>",
"[user] begins to perform plastic surgery on [target].",
"[user] begins to perform plastic surgery on [target].")
/datum/surgery_step/augment_penis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/genital/penis/P = target.getorganslot("penis")
//Patient has a cock
if(P)
//Reduce their size
if(tool.is_sharp())
P.cached_length = P.cached_length - 1
P.update()
return 1
//Increase the size
if(istype(tool, /obj/item/stack/sheet/plastic))
var/obj/item/stack/sheet/plastic/pS = tool
pS.amount = pS.amount - 1
if(pS.amount < 1)
pS.Destroy()
P.cached_length = P.cached_length + 1
P.update()
return 1
//Patient does not have a cock
else
//Give 'em a cock
if(istype(tool, /obj/item/stack/sheet/plastic))
//Makes it so no one has a weird coloured dick
var/mob/living/carbon/human/H = target
if(H.dna.species.use_skintones)
H.dna.features["penis_color"] = skintone2hex(H.skin_tone)
else
H.dna.features["penis_color"] = H.dna.features["mcolor"]
var/obj/item/stack/sheet/plastic/pS = tool
pS.amount = pS.amount - 1
if(pS.amount < 1)
pS.Destroy()
var/obj/item/organ/genital/penis/nP = new
nP.length = 1
nP.cached_length = 1
nP.prev_length = 0
nP.Insert(target)
nP.update()
return 1