Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit28
This commit is contained in:
@@ -26,7 +26,9 @@
|
||||
return
|
||||
|
||||
/mob/camera/forceMove(atom/destination)
|
||||
var/oldloc = loc
|
||||
loc = destination
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
|
||||
/mob/camera/emote(act, m_type=1, message = null, intentional = FALSE)
|
||||
return
|
||||
|
||||
@@ -34,7 +34,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
var/turf/new_turf = get_turf(destination)
|
||||
if (old_turf?.z != new_turf?.z)
|
||||
onTransitZ(old_turf?.z, new_turf?.z)
|
||||
var/oldloc = loc
|
||||
loc = destination
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
|
||||
/mob/dead/Stat()
|
||||
..()
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
return
|
||||
|
||||
var/obj/effect/mob_spawn/MS = pick(GLOB.mob_spawners[href_list["JoinAsGhostRole"]])
|
||||
if(istype(MS) && MS.attack_ghost(src, latejoinercalling = TRUE))
|
||||
if(MS?.attack_ghost(src, latejoinercalling = TRUE))
|
||||
SSticker.queued_players -= src
|
||||
SSticker.queue_delay = 4
|
||||
qdel(src)
|
||||
@@ -443,9 +443,10 @@
|
||||
for(var/datum/job/job in SSjob.occupations)
|
||||
if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE)
|
||||
available_job_count++
|
||||
for(var/spawner in GLOB.mob_spawners)
|
||||
available_job_count++
|
||||
break
|
||||
for(var/obj/effect/mob_spawn/spawner in GLOB.mob_spawners)
|
||||
if(spawner.can_latejoin())
|
||||
available_job_count++
|
||||
break
|
||||
|
||||
if(!available_job_count)
|
||||
dat += "<div class='notice red'>There are currently no open positions!</div>"
|
||||
@@ -464,8 +465,9 @@
|
||||
"Science" = list(jobs = list(), titles = GLOB.science_positions, color = "#e6b3e6"),
|
||||
"Security" = list(jobs = list(), titles = GLOB.security_positions, color = "#ff9999"),
|
||||
)
|
||||
for(var/spawner in GLOB.mob_spawners)
|
||||
categorizedJobs["Ghost Role"]["jobs"] += spawner
|
||||
for(var/obj/effect/mob_spawn/spawner in GLOB.mob_spawners)
|
||||
if(spawner.can_latejoin())
|
||||
categorizedJobs["Ghost Role"]["jobs"] += spawner
|
||||
|
||||
for(var/datum/job/job in SSjob.occupations)
|
||||
if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE)
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
|
||||
// please make sure they're sorted alphabetically and categorized
|
||||
|
||||
/datum/sprite_accessory/socks/bee_knee
|
||||
name = "Knee-high (Bee)"
|
||||
icon_state = "bee_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/black_knee
|
||||
name = "Knee-high (Black)"
|
||||
icon_state = "black_knee"
|
||||
@@ -63,6 +67,42 @@
|
||||
name = "Short (White)"
|
||||
icon_state = "white_short"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_blue
|
||||
name = "Stockings (Blue)"
|
||||
icon_state = "stockings_blue"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_cyan
|
||||
name = "Stockings (Cyan)"
|
||||
icon_state = "stockings_cyan"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_dpink
|
||||
name = "Stockings (Dark Pink)"
|
||||
icon_state = "stockings_dpink"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_green
|
||||
name = "Stockings (Green)"
|
||||
icon_state = "stockings_black"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_orange
|
||||
name = "Stockings (Orange)"
|
||||
icon_state = "stockings_orange"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_programmer
|
||||
name = "Stockings (Programmer)"
|
||||
icon_state = "stockings_lpink"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_purple
|
||||
name = "Stockings (Purple)"
|
||||
icon_state = "stockings_purple"
|
||||
|
||||
/datum/sprite_accessory/socks/stockings_yellow
|
||||
name = "Stockings (Yellow)"
|
||||
icon_state = "stockings_yellow"
|
||||
|
||||
/datum/sprite_accessory/socks/bee_thigh
|
||||
name = "Thigh-high (Bee)"
|
||||
icon_state = "bee_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/black_thigh
|
||||
name = "Thigh-high (Black)"
|
||||
icon_state = "black_thigh"
|
||||
@@ -93,4 +133,4 @@
|
||||
|
||||
/datum/sprite_accessory/socks/white_thigh
|
||||
name = "Thigh-high (White)"
|
||||
icon_state = "white_thigh"
|
||||
icon_state = "white_thigh"
|
||||
|
||||
@@ -248,9 +248,13 @@
|
||||
icon_state = "bra_commie"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_babyblue
|
||||
name = "Bra, Baby Blue"
|
||||
name = "Bra - Baby Blue"
|
||||
icon_state = "bra_babyblue"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_beekini
|
||||
name = "Bra - Bee-kini"
|
||||
icon_state = "bra_bee-kini"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_black
|
||||
name = "Bra - Black"
|
||||
icon_state = "bra_black"
|
||||
|
||||
@@ -90,6 +90,9 @@
|
||||
name = "Boxer Briefs - Yellow"
|
||||
icon_state = "boxer_briefs_yellow"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_beekini
|
||||
name = "Panties - Bee-kini"
|
||||
icon_state = "panties_bee-kini"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_black
|
||||
name = "Panties - Black"
|
||||
|
||||
@@ -429,9 +429,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/orbitsize = (I.Width()+I.Height())*0.5
|
||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||
|
||||
if(orbiting && orbiting.orbiting != target)
|
||||
to_chat(src, "<span class='notice'>Now orbiting [target].</span>")
|
||||
|
||||
var/rot_seg
|
||||
|
||||
switch(ghost_orbit)
|
||||
@@ -450,10 +447,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
/mob/dead/observer/orbit()
|
||||
setDir(2)//reset dir so the right directional sprites show up
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/dead/observer/stop_orbit()
|
||||
..()
|
||||
/mob/dead/observer/stop_orbit(datum/component/orbiter/orbits)
|
||||
. = ..()
|
||||
//restart our floating animation after orbit is done.
|
||||
pixel_y = 0
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
@@ -753,7 +750,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
update_icon()
|
||||
|
||||
/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
return IsAdminGhost(usr)
|
||||
|
||||
/mob/dead/observer/is_literate()
|
||||
|
||||
@@ -895,6 +895,11 @@
|
||||
var/obj/item/organ/I = X
|
||||
I.Insert(src)
|
||||
|
||||
/mob/living/carbon/proc/update_disabled_bodyparts()
|
||||
for(var/B in bodyparts)
|
||||
var/obj/item/bodypart/BP = B
|
||||
BP.update_disabled()
|
||||
|
||||
/mob/living/carbon/vv_get_dropdown()
|
||||
. = ..()
|
||||
. += "---"
|
||||
|
||||
@@ -294,7 +294,7 @@
|
||||
if(mood.sanity <= SANITY_DISTURBED)
|
||||
msg += "[t_He] seem[p_s()] distressed.\n"
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src)
|
||||
if(mood.mood >= 5) //So roundstart people aren't all "happy"
|
||||
if(mood.shown_mood >= 6) //So roundstart people aren't all "happy" and that antags don't show their true happiness.
|
||||
msg += "[t_He] seem[p_s()] to have had something nice happen to them recently.\n"
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empathH", /datum/mood_event/happy_empath, src)
|
||||
if (HAS_TRAIT(src, TRAIT_BLIND))
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
/mob/living/carbon/human/Initialize()
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
verbs += /mob/living/proc/lay_down
|
||||
verbs += /mob/living/carbon/human/proc/underwear_toggle //fwee
|
||||
|
||||
//initialize limbs first
|
||||
create_bodyparts()
|
||||
@@ -724,12 +725,12 @@
|
||||
remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000")
|
||||
cut_overlay(MA)
|
||||
|
||||
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated() || lying )
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
if(!Adjacent(M) && (M.loc != src))
|
||||
if((be_close == 0) || (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))
|
||||
if((be_close == 0) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M))))
|
||||
return TRUE
|
||||
to_chat(src, "<span class='warning'>You are too far away!</span>")
|
||||
return FALSE
|
||||
@@ -855,13 +856,16 @@
|
||||
buckle_mob(target,TRUE,TRUE)
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/proc/piggyback_instant(mob/living/M)
|
||||
return buckle_mob(M, TRUE, TRUE, FALSE, TRUE)
|
||||
|
||||
//Can C try to piggyback at all.
|
||||
/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/C)
|
||||
if(istype(C) && C.stat == CONSCIOUS)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, bypass_piggybacking = FALSE)
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, bypass_piggybacking = FALSE, no_delay = FALSE)
|
||||
if(!force)//humans are only meant to be ridden through piggybacking and special cases
|
||||
return
|
||||
if(bypass_piggybacking)
|
||||
@@ -878,7 +882,7 @@
|
||||
if(can_piggyback(M))
|
||||
riding_datum.ride_check_ridden_incapacitated = TRUE
|
||||
visible_message("<span class='notice'>[M] starts to climb onto [src]...</span>")
|
||||
if(force || do_after(M, 15, target = src))
|
||||
if(no_delay || do_after(M, 15, target = src))
|
||||
if(can_piggyback(M))
|
||||
if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
|
||||
M.visible_message("<span class='warning'>[M] can't hang onto [src]!</span>")
|
||||
|
||||
@@ -54,7 +54,12 @@
|
||||
else
|
||||
visible_message("<span class='danger'>[src] deflects the projectile!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
|
||||
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
|
||||
return 0
|
||||
if(!mind.martial_art.reroute_deflection)
|
||||
return FALSE
|
||||
else
|
||||
P.firer = src
|
||||
P.setAngle(rand(0, 360))//SHING
|
||||
return FALSE
|
||||
|
||||
if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself
|
||||
if(P.is_reflectable)
|
||||
|
||||
@@ -44,6 +44,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/siemens_coeff = 1 //base electrocution coefficient
|
||||
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
|
||||
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
|
||||
var/list/special_step_sounds //Sounds to override barefeet walkng
|
||||
var/grab_sound //Special sound for grabbing
|
||||
|
||||
// species-only traits. Can be found in DNA.dm
|
||||
var/list/species_traits = list()
|
||||
@@ -490,11 +492,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
//Underwear, Undershirts & Socks
|
||||
if(!(NO_UNDERWEAR in species_traits))
|
||||
if(H.underwear)
|
||||
if(H.hidden_underwear)
|
||||
H.underwear = "Nude"
|
||||
else
|
||||
H.underwear = H.saved_underwear
|
||||
var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear]
|
||||
if(underwear)
|
||||
standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER)
|
||||
|
||||
if(H.undershirt)
|
||||
if(H.hidden_undershirt)
|
||||
H.undershirt = "Nude"
|
||||
else
|
||||
H.undershirt = H.saved_undershirt
|
||||
var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt]
|
||||
if(undershirt)
|
||||
if(H.dna.species.sexes && H.gender == FEMALE)
|
||||
@@ -503,6 +513,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
|
||||
|
||||
if(H.socks && H.get_num_legs(FALSE) >= 2)
|
||||
if(H.hidden_socks)
|
||||
H.socks = "Nude"
|
||||
else
|
||||
H.socks = H.saved_socks
|
||||
var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
|
||||
if(socks)
|
||||
if(DIGITIGRADE in species_traits)
|
||||
@@ -1288,7 +1302,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
. += H.physiology.speed_mod
|
||||
|
||||
if (H.m_intent == MOVE_INTENT_WALK && HAS_TRAIT(H, TRAIT_SPEEDY_STEP))
|
||||
. -= 1
|
||||
. -= 1.5
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN))
|
||||
ignoreslow = 1
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
var/list/special_names = list("Tarkus")
|
||||
var/human_surname_chance = 3
|
||||
var/special_name_chance = 5
|
||||
var/owner //dobby is a free golem
|
||||
|
||||
/datum/species/golem/random_name(gender,unique,lastname)
|
||||
var/golem_surname = pick(GLOB.golem_names)
|
||||
@@ -807,3 +808,196 @@
|
||||
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
C.ventcrawler = initial(C.ventcrawler)
|
||||
|
||||
/datum/species/golem/bronze
|
||||
name = "Bronze Golem"
|
||||
id = "bronze golem"
|
||||
prefix = "Bronze"
|
||||
special_names = list("Bell")
|
||||
fixed_mut_color = "cd7f32"
|
||||
info_text = "As a <span class='danger'>Bronze Golem</span>, you are very resistant to loud noises, and make loud noises if something hard hits you, however this ability does hurt your hearing."
|
||||
special_step_sounds = list('sound/machines/clockcult/integration_cog_install.ogg', 'sound/magic/clockwork/fellowship_armory.ogg' )
|
||||
attack_verb = "bonk"
|
||||
mutantears = /obj/item/organ/ears/bronze
|
||||
var/last_gong_time = 0
|
||||
var/gong_cooldown = 150
|
||||
|
||||
/datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
if(!(world.time > last_gong_time + gong_cooldown))
|
||||
return ..()
|
||||
if(P.flag == "bullet" || P.flag == "bomb")
|
||||
gong(H)
|
||||
return ..()
|
||||
|
||||
/datum/species/golem/bronze/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown && M.a_intent != INTENT_HELP)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
..()
|
||||
if(world.time > last_gong_time + gong_cooldown)
|
||||
gong(H)
|
||||
|
||||
/datum/species/golem/bronze/proc/gong(mob/living/carbon/human/H)
|
||||
last_gong_time = world.time
|
||||
for(var/mob/living/M in get_hearers_in_view(7,H))
|
||||
if(M.stat == DEAD) //F
|
||||
return
|
||||
if(M == H)
|
||||
H.show_message("<span class='narsiesmall'>You cringe with pain as your body rings around you!</span>", 2)
|
||||
H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
|
||||
H.soundbang_act(2, 0, 100, 1)
|
||||
H.jitteriness += 7
|
||||
var/distance = max(0,get_dist(get_turf(H),get_turf(M)))
|
||||
switch(distance)
|
||||
if(0 to 1)
|
||||
M.show_message("<span class='narsiesmall'>GONG!</span>", 2)
|
||||
M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
|
||||
M.soundbang_act(1, 0, 30, 3)
|
||||
M.confused += 10
|
||||
M.jitteriness += 4
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
|
||||
if(2 to 3)
|
||||
M.show_message("<span class='cult'>GONG!</span>", 2)
|
||||
M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE)
|
||||
M.soundbang_act(1, 0, 15, 2)
|
||||
M.jitteriness += 3
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
|
||||
else
|
||||
M.show_message("<span class='warning'>GONG!</span>", 2)
|
||||
M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE)
|
||||
|
||||
|
||||
/datum/species/golem/cardboard //Faster but weaker, can also make new shells on its own
|
||||
name = "Cardboard Golem"
|
||||
id = "cardboard golem"
|
||||
prefix = "Cardboard"
|
||||
special_names = list("Box")
|
||||
info_text = "As a <span class='danger'>Cardboard Golem</span>, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself."
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
fixed_mut_color = "ffffff"
|
||||
limbs_id = "c_golem" //special sprites
|
||||
attack_verb = "bash"
|
||||
armor = 25
|
||||
burnmod = 1.25
|
||||
heatmod = 2
|
||||
speedmod = 1.5
|
||||
punchdamagelow = 4
|
||||
punchstunthreshold = 7
|
||||
punchdamagehigh = 8
|
||||
var/last_creation = 0
|
||||
var/brother_creation_cooldown = 300
|
||||
|
||||
/datum/species/golem/cardboard/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(user != H)
|
||||
return FALSE //forced reproduction is rape.
|
||||
if(istype(I, /obj/item/stack/sheet/cardboard))
|
||||
var/obj/item/stack/sheet/cardboard/C = I
|
||||
if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork
|
||||
return
|
||||
if(C.amount < 10)
|
||||
to_chat(H, "<span class='warning'>You do not have enough cardboard!</span>")
|
||||
return FALSE
|
||||
to_chat(H, "<span class='notice'>You attempt to create a new cardboard brother.</span>")
|
||||
if(do_after(user, 30, target = user))
|
||||
if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork
|
||||
return
|
||||
if(!C.use(10))
|
||||
to_chat(H, "<span class='warning'>You do not have enough cardboard!</span>")
|
||||
return FALSE
|
||||
to_chat(H, "<span class='notice'>You create a new cardboard golem shell.</span>")
|
||||
create_brother(H.loc)
|
||||
|
||||
/datum/species/golem/cardboard/proc/create_brother(var/location)
|
||||
new /obj/effect/mob_spawn/human/golem/servant(location, /datum/species/golem/cardboard, owner)
|
||||
last_creation = world.time
|
||||
|
||||
/datum/species/golem/leather
|
||||
name = "Leather Golem"
|
||||
id = "leather golem"
|
||||
special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
|
||||
prefix = "Leather"
|
||||
fixed_mut_color = "624a2e"
|
||||
info_text = "As a <span class='danger'>Leather Golem</span>, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
|
||||
attack_verb = "whipp"
|
||||
grab_sound = 'sound/weapons/whipgrab.ogg'
|
||||
attack_sound = 'sound/weapons/whip.ogg'
|
||||
|
||||
/datum/species/golem/bone
|
||||
name = "Bone Golem"
|
||||
id = "bone golem"
|
||||
say_mod = "rattles"
|
||||
prefix = "Bone"
|
||||
limbs_id = "b_golem"
|
||||
special_names = list("Head", "Broth", "Fracture", "Rattler", "Appetit")
|
||||
liked_food = GROSS | MEAT | RAW
|
||||
toxic_food = null
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
sexes = FALSE
|
||||
fixed_mut_color = "ffffff"
|
||||
attack_verb = "rattl"
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER)
|
||||
info_text = "As a <span class='danger'>Bone Golem</span>, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
|
||||
var/datum/action/innate/bonechill/bonechill
|
||||
|
||||
/datum/species/golem/bone/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
if(ishuman(C))
|
||||
bonechill = new
|
||||
bonechill.Grant(C)
|
||||
|
||||
/datum/species/golem/bone/on_species_loss(mob/living/carbon/C)
|
||||
if(bonechill)
|
||||
bonechill.Remove(C)
|
||||
..()
|
||||
|
||||
/datum/action/innate/bonechill
|
||||
name = "Bone Chill"
|
||||
desc = "Rattle your bones and strike fear into your enemies!"
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
icon_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
button_icon_state = "bonechill"
|
||||
var/cooldown = 600
|
||||
var/last_use
|
||||
var/snas_chance = 3
|
||||
|
||||
/datum/action/innate/bonechill/Activate()
|
||||
if(world.time < last_use + cooldown)
|
||||
to_chat("<span class='notice'>You aren't ready yet to rattle your bones again</span>")
|
||||
return
|
||||
owner.visible_message("<span class='warning'>[owner] rattles [owner.p_their()] bones harrowingly.</span>", "<span class='notice'>You rattle your bones</span>")
|
||||
last_use = world.time
|
||||
if(prob(snas_chance))
|
||||
playsound(get_turf(owner),'sound/magic/RATTLEMEBONES2.ogg', 100)
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/mutable_appearance/badtime = mutable_appearance('icons/mob/human_parts.dmi', "b_golem_eyes", -FIRE_LAYER-0.5)
|
||||
badtime.appearance_flags = RESET_COLOR
|
||||
H.overlays_standing[FIRE_LAYER+0.5] = badtime
|
||||
H.apply_overlay(FIRE_LAYER+0.5)
|
||||
addtimer(CALLBACK(H, /mob/living/carbon/.proc/remove_overlay, FIRE_LAYER+0.5), 25)
|
||||
else
|
||||
playsound(get_turf(owner),'sound/magic/RATTLEMEBONES.ogg', 100)
|
||||
for(var/mob/living/L in orange(7, get_turf(owner)))
|
||||
if((MOB_UNDEAD in L.mob_biotypes) || isgolem(L) || HAS_TRAIT(L, TRAIT_RESISTCOLD))
|
||||
return //Do not affect our brothers
|
||||
|
||||
to_chat(L, "<span class='cultlarge'>A spine-chilling sound chills you to the bone!</span>")
|
||||
L.apply_status_effect(/datum/status_effect/bonechill)
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "spooked", /datum/mood_event/spooked)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
sexes = 0
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
sexes = 0
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
|
||||
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
|
||||
@@ -21,4 +21,4 @@
|
||||
|
||||
/datum/species/skeleton/pirate
|
||||
name = "Space Queen's Skeleton"
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
|
||||
@@ -654,6 +654,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
L.damage += d
|
||||
|
||||
/mob/living/carbon/proc/liver_failure()
|
||||
reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs
|
||||
reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE)
|
||||
if(HAS_TRAIT(src, TRAIT_STABLEHEART))
|
||||
return
|
||||
|
||||
@@ -73,39 +73,21 @@
|
||||
if(I.loc == src)
|
||||
return TRUE
|
||||
|
||||
if(I.anchored)
|
||||
if(I.anchored || !put_in_hands(I))
|
||||
blacklistItems[I] ++
|
||||
return FALSE
|
||||
|
||||
// WEAPONS
|
||||
if(istype(I, /obj/item))
|
||||
var/obj/item/W = I
|
||||
if(W.force >= best_force)
|
||||
put_in_hands(W)
|
||||
best_force = W.force
|
||||
return TRUE
|
||||
|
||||
// CLOTHING
|
||||
else if(istype(I, /obj/item/clothing))
|
||||
var/obj/item/clothing/C = I
|
||||
monkeyDrop(C)
|
||||
addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5)
|
||||
return TRUE
|
||||
|
||||
// EVERYTHING ELSE
|
||||
if(I.force >= best_force)
|
||||
best_force = I.force
|
||||
else
|
||||
if(!get_item_for_held_index(1) || !get_item_for_held_index(2))
|
||||
put_in_hands(I)
|
||||
return TRUE
|
||||
addtimer(CALLBACK(src, .proc/pickup_and_wear, I), 5)
|
||||
|
||||
blacklistItems[I] ++
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/monkey/proc/pickup_and_wear(var/obj/item/clothing/C)
|
||||
if(!equip_to_appropriate_slot(C))
|
||||
monkeyDrop(get_item_by_slot(C)) // remove the existing item if worn
|
||||
sleep(5)
|
||||
equip_to_appropriate_slot(C)
|
||||
/mob/living/carbon/monkey/proc/pickup_and_wear(obj/item/I)
|
||||
if(QDELETED(I) || I.loc != src)
|
||||
return
|
||||
equip_to_appropriate_slot(I)
|
||||
|
||||
/mob/living/carbon/monkey/resist_restraints()
|
||||
var/obj/item/I = null
|
||||
@@ -311,7 +293,8 @@
|
||||
if(I == pickupTarget)
|
||||
M.visible_message("<span class='danger'>[src] snatches [pickupTarget] from [M].</span>", "<span class='userdanger'>[src] snatched [pickupTarget]!</span>")
|
||||
if(M.temporarilyRemoveItemFromInventory(pickupTarget) && !QDELETED(pickupTarget))
|
||||
equip_item(pickupTarget)
|
||||
if(!equip_item(pickupTarget))
|
||||
dropItemToGround(pickupTarget)
|
||||
else
|
||||
M.visible_message("<span class='danger'>[src] tried to snatch [pickupTarget] from [M], but failed!</span>", "<span class='userdanger'>[src] tried to grab [pickupTarget]!</span>")
|
||||
pickpocketing = FALSE
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
var/mob/M = AM
|
||||
|
||||
log_combat(src, M, "grabbed", addition="passive grab")
|
||||
if(!supress_message)
|
||||
if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER)))
|
||||
visible_message("<span class='warning'>[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!</span>") //Cit change - And they thought ERP was bad.
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
@@ -281,6 +281,11 @@
|
||||
var/datum/disease/D = thing
|
||||
if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
|
||||
ContactContractDisease(D)
|
||||
|
||||
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
|
||||
@@ -814,7 +819,7 @@
|
||||
/mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering
|
||||
return
|
||||
|
||||
/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -288,8 +288,17 @@
|
||||
|
||||
/mob/living/silicon/ai/can_interact_with(atom/A)
|
||||
. = ..()
|
||||
var/turf/ai = get_turf(src)
|
||||
var/turf/target = get_turf(A)
|
||||
if (.)
|
||||
return
|
||||
|
||||
if(!target)
|
||||
return
|
||||
|
||||
if ((ai.z != target.z) && !is_station_level(ai.z))
|
||||
return FALSE
|
||||
|
||||
if (istype(loc, /obj/item/aicard))
|
||||
var/turf/T0 = get_turf(src)
|
||||
var/turf/T1 = get_turf(A)
|
||||
@@ -779,7 +788,7 @@
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(control_disabled || incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
|
||||
// See software.dm for Topic()
|
||||
|
||||
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(be_close && !in_range(M, src))
|
||||
to_chat(src, "<span class='warning'>You are too far away!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -910,7 +910,7 @@
|
||||
if(DISCONNECT) //Tampering with the wires
|
||||
to_chat(connected_ai, "<br><br><span class='notice'>NOTICE - Remote telemetry lost with [name].</span><br>")
|
||||
|
||||
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(stat || lockcharge || low_power_mode)
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -131,7 +131,6 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
user << "<span class='danger'>You short out [src]'s sound control system. It gives out an evil laugh!!</span>"
|
||||
oldtarget_name = user.name
|
||||
audible_message("<span class='danger'>[src] gives out an evil laugh!</span>")
|
||||
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, 1, -1) // evil laughter
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/mob/living/simple_animal/pet/redpanda
|
||||
name = "Red panda"
|
||||
desc = "Wah't a dork."
|
||||
icon = 'icons/mob/pets.dmi'
|
||||
icon_state = "red_panda"
|
||||
icon_living = "red_panda"
|
||||
icon_dead = "dead_panda"
|
||||
speak = list("Churip","Chuuriip","Cheep-cheep","Chiteurp","squueeaacipt")
|
||||
speak_emote = list("chirps", "huff-quacks")
|
||||
emote_hear = list("squeak-chrips.", "huff-squacks.")
|
||||
emote_see = list("shakes its head.", "rolls about.")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
do_footstep = TRUE
|
||||
@@ -596,6 +596,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
/obj/item/guardiancreator/tech/choose/traitor
|
||||
possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
|
||||
|
||||
/obj/item/guardiancreator/tech/choose/traitor/check_uplink_validity()
|
||||
return !used
|
||||
|
||||
/obj/item/guardiancreator/tech/choose
|
||||
random = FALSE
|
||||
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
if(target)
|
||||
return new childspawn(target)
|
||||
|
||||
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -784,7 +784,7 @@
|
||||
return 0
|
||||
|
||||
//Can the mob use Topic to interact with machines
|
||||
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
|
||||
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
return
|
||||
|
||||
/mob/proc/faction_check_mob(mob/target, exact_match)
|
||||
@@ -871,13 +871,7 @@
|
||||
return
|
||||
|
||||
/mob/proc/update_sight()
|
||||
for(var/O in orbiters)
|
||||
var/datum/orbit/orbit = O
|
||||
var/obj/effect/wisp/wisp = orbit.orbiter
|
||||
if (istype(wisp))
|
||||
sight |= wisp.sight_flags
|
||||
if(!isnull(wisp.lighting_alpha))
|
||||
lighting_alpha = min(lighting_alpha, wisp.lighting_alpha)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
|
||||
|
||||
sync_lighting_plane_alpha()
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
if(INCORPOREAL_MOVE_BASIC)
|
||||
var/T = get_step(L,direct)
|
||||
if(T)
|
||||
L.loc = T
|
||||
L.forceMove(T)
|
||||
L.setDir(direct)
|
||||
if(INCORPOREAL_MOVE_SHADOW)
|
||||
if(prob(50))
|
||||
@@ -190,7 +190,7 @@
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
|
||||
var/T = get_step(L,direct)
|
||||
if(T)
|
||||
L.loc = T
|
||||
L.forceMove(T)
|
||||
L.setDir(direct)
|
||||
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
var/turf/open/floor/stepTurf = get_step(L, direct)
|
||||
@@ -209,7 +209,7 @@
|
||||
to_chat(L, "<span class='warning'>Holy energies block your path!</span>")
|
||||
return
|
||||
|
||||
L.loc = get_step(L, direct)
|
||||
L.forceMove(stepTurf)
|
||||
L.setDir(direct)
|
||||
return TRUE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user