Merge branch 'master' of https://github.com/PolarisSS13/Polaris into radiation_tweaks

# Conflicts:
#	code/game/objects/items/devices/defib.dm
This commit is contained in:
Anewbe
2017-11-26 17:53:00 -06:00
441 changed files with 21654 additions and 16696 deletions
+7
View File
@@ -41,6 +41,7 @@
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
var/icon_scale_percent // Makes the holder's icon get scaled up or down.
/datum/modifier/New(var/new_holder, var/new_origin)
holder = new_holder
@@ -62,6 +63,8 @@
holder.modifiers.Remove(src)
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
holder.update_modifier_visuals()
if(icon_scale_percent) // Correct the scaling.
holder.update_transform()
qdel(src)
// Override this for special effects when it gets removed.
@@ -117,6 +120,8 @@
modifiers.Add(mod)
if(mod.mob_overlay_state)
update_modifier_visuals()
if(mod.icon_scale_percent)
update_transform()
return mod
@@ -198,6 +203,8 @@
effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
causing reagents in your body to process, and hunger to occur [multipler_to_percentage(metabolism_percent, TRUE)] [metabolism_percent > 1.0 ? "faster" : "slower"]."
if(!isnull(icon_scale_percent))
effects += "Your appearance is [multipler_to_percentage(icon_scale_percent, TRUE)] [icon_scale_percent > 1 ? "larger" : "smaller"]."
return jointext(effects, "<br>")
+25 -1
View File
@@ -58,4 +58,28 @@
desc = "Your body's metabolism is slower than average."
metabolism_percent = 0.5
incoming_healing_percent = 0.6
incoming_healing_percent = 0.6
/datum/modifier/trait/larger
name = "Larger"
desc = "Your body is larger than average."
icon_scale_percent = 1.2
/datum/modifier/trait/large
name = "Large"
desc = "Your body is a bit larger than average."
icon_scale_percent = 1.1
/datum/modifier/trait/small
name = "Small"
desc = "Your body is a bit smaller than average."
icon_scale_percent = 0.95
/datum/modifier/trait/smaller
name = "Smaller"
desc = "Your body is smaller than average."
icon_scale_percent = 0.9
+12 -7
View File
@@ -201,6 +201,11 @@ Works together with spawning an observer, noted above.
/mob/proc/ghostize(var/can_reenter_corpse = 1)
if(key)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.vr_holder && !can_reenter_corpse)
H.exit_vr()
return 0
var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
@@ -243,9 +248,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/turf/location = get_turf(src)
message_admins("[key_name_admin(usr)] has ghosted. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(usr)] has ghosted.")
var/mob/observer/dead/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
announce_ghost_joinleave(ghost)
var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
if(ghost)
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
announce_ghost_joinleave(ghost)
/mob/observer/dead/can_use_hands() return 0
/mob/observer/dead/is_active() return 0
@@ -310,19 +316,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!client)
return
var/mentor = is_eventM(usr.client)
if(!config.antag_hud_allowed && (!client.holder || mentor))
if(!config.antag_hud_allowed && !client.holder)
src << "<font color='red'>Admins have disabled this for this round.</font>"
return
var/mob/observer/dead/M = src
if(jobban_isbanned(M, "AntagHUD"))
src << "<font color='red'><B>You have been banned from using this feature</B></font>"
return
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && (!client.holder || mentor))
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !client.holder)
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
if(response == "No") return
M.can_reenter_corpse = 0
if(!M.has_enabled_antagHUD && (!client.holder || mentor))
if(!M.has_enabled_antagHUD && !client.holder)
M.has_enabled_antagHUD = 1
if(M.antagHUD)
M.antagHUD = 0
@@ -15,7 +15,7 @@
if (I_GRAB)
if (M == src)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, M, src )
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, src )
M.put_in_active_hand(G)
@@ -56,4 +56,4 @@
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("<font color='red'><B>[] has attempted to punch []!</B></font>", M, src), 1)
return
return
@@ -37,4 +37,12 @@
return
hat = new_hat
new_hat.loc = src
update_icons()
update_icons()
/mob/living/carbon/alien/diona/proc/handle_npc(var/mob/living/carbon/alien/diona/D)
if(D.stat != CONSCIOUS)
return
if(prob(33) && D.canmove && isturf(D.loc) && !D.pulledby) //won't move if being pulled
step(D, pick(cardinal))
if(prob(1))
D.emote(pick("scratch","jump","chirp","roll"))
@@ -14,10 +14,10 @@
/mob/living/carbon/alien/diona/attackby(var/obj/item/weapon/W, var/mob/user)
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
if(hat)
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
return
user.unEquip(W)
wear_hat(W)
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
return
return ..()
return ..()
@@ -14,4 +14,8 @@
adjustBruteLoss(-1)
adjustFireLoss(-1)
adjustToxLoss(-1)
adjustOxyLoss(-1)
adjustOxyLoss(-1)
if(!client)
handle_npc(src)
+17 -9
View File
@@ -109,20 +109,28 @@
playsound(loc, "sparks", 50, 1, -1)
if (shock_damage > 15)
src.visible_message(
"<font color='red'>[src] was shocked by \the [source]!</font>", \
"<font color='red'><B>You feel a powerful shock course through your body!</B></font>", \
"<font color='red'>You hear a heavy electrical crack.</font>" \
"<span class='warning'>[src] was electrocuted[source ? " by the [source]" : ""]!</span>", \
"<span class='danger'>You feel a powerful shock course through your body!</span>", \
"<span class='warning'>You hear a heavy electrical crack.</span>" \
)
if(stun)
Stun(10)//This should work for now, more is really silly and makes you lay there forever
Weaken(10)
else
src.visible_message(
"<font color='red'>[src] was mildly shocked by \the [source].</font>", \
"<font color='red'>You feel a mild shock course through your body.</font>", \
"<font color='red'>You hear a light zapping.</font>" \
"<span class='warning'>[src] was shocked[source ? " by the [source]" : ""].</span>", \
"<span class='warning'>You feel a shock course through your body.</span>", \
"<span class='warning'>You hear a zapping sound.</span>" \
)
if(stun)
switch(shock_damage)
if(16 to 20)
Stun(2)
if(21 to 25)
Weaken(2)
if(26 to 30)
Weaken(5)
if(31 to INFINITY)
Weaken(10) //This should work for now, more is really silly and makes you lay there forever
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, loc)
s.start()
@@ -25,7 +25,7 @@
weapon_edge = 0
hit_embed_chance = I.force/(I.w_class*3)
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
//Melee weapon embedded object code.
if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I) && I.embed_chance > 0)
@@ -95,7 +95,7 @@
return 1
/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue)
if(red == r_eyes && green == g_eyes && blue == b_eyes)
if(red == r_hair && green == g_hair && blue == b_hair)
return
r_hair = red
+25 -1
View File
@@ -1,5 +1,15 @@
/mob/living/carbon/human/gib()
if(vr_holder)
exit_vr()
// Delete the link, because this mob won't be around much longer
vr_holder.vr_link = null
if(vr_link)
vr_link.exit_vr()
vr_link.vr_holder = null
vr_link = null
for(var/obj/item/organ/I in internal_organs)
I.removed()
if(istype(loc,/turf))
@@ -80,6 +90,20 @@
if(wearing_rig)
wearing_rig.notify_ai("<span class='danger'>Warning: user death event. Mobility control passed to integrated intelligence system.</span>")
// If the body is in VR, move the mind back to the real world
if(vr_holder)
src.exit_vr()
src.vr_holder.vr_link = null
for(var/obj/item/W in src)
src.drop_from_inventory(W)
// If our mind is in VR, bring it back to the real world so it can die with its body
if(vr_link)
vr_link.exit_vr()
vr_link.vr_holder = null
vr_link = null
to_chat(src, "<span class='danger'>Everything abruptly stops.</span>")
return ..(gibbed,species.get_death_message(src))
/mob/living/carbon/human/proc/ChangeToHusk()
@@ -113,4 +137,4 @@
mutations.Add(SKELETON)
status_flags |= DISFIGURED
update_body(1)
return
return
@@ -18,17 +18,9 @@
var/skiparms = 0
var/skipfeet = 0
var/cloaked = 0 // 0 for normal, 1 for cloaked close
if(mind && mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer))
var/distance = get_dist(user, src)
if(distance > 2)
src.loc.examine(user)
return
else
cloaked = 1
if(alpha <= 50)
src.loc.examine(user)
return
var/looks_synth = looksSynthetic()
@@ -97,8 +89,6 @@
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
T = gender_datums[PLURAL]
if(cloaked)
T = gender_datums[NEUTER]
else if(species && species.ambiguous_genders)
var/can_detect_gender = FALSE
@@ -458,25 +448,18 @@
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
if(print_flavor_text() && !cloaked)
if(print_flavor_text())
msg += "[print_flavor_text()]\n"
msg += "*---------*</span><br>"
msg += applying_pressure
if (pose && !cloaked)
if (pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "[T.He] [pose]"
user << jointext(msg, null)
/mob/living/carbon/human/get_description_fluff()
if(mind && mind.changeling && mind.changeling.cloaked)
return ""
else
return ..()
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
/proc/hasHUD(mob/M as mob, hudtype)
if(istype(M, /mob/living/carbon/human))
+64 -6
View File
@@ -15,6 +15,8 @@
var/spit_name = null //String
var/last_spit = 0 //Timestamp.
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
if(!dna)
@@ -36,8 +38,12 @@
nutrition = rand(200,400)
hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100")
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
if(isSynthetic())
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudrobo")
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudrobo")
else
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
hud_list[ID_HUD] = new /image/hud_overlay(using_map.id_hud_icons, src, "hudunknown")
hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
@@ -318,15 +324,13 @@
//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
/mob/living/carbon/human/proc/get_visible_name()
if( mind && mind.changeling && mind.changeling.cloaked)
return "Unknown"
if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible
return get_id_name("Unknown")
if( head && (head.flags_inv&HIDEFACE) )
return get_id_name("Unknown") //Likewise for hats
var/face_name = get_face_name()
var/id_name = get_id_name("")
if(id_name && (id_name != face_name))
if((face_name == "Unknown") && id_name && (id_name != face_name))
return "[face_name] (as [id_name])"
return face_name
@@ -1136,6 +1140,9 @@
if(species.default_language)
add_language(species.default_language)
if(species.icon_scale != 1)
update_transform()
if(species.base_color && default_colour)
//Apply colour.
r_skin = hex2num(copytext(species.base_color,2,4))
@@ -1523,4 +1530,55 @@
var/turf/T = get_turf(src)
var/obj/item/clothing/accessory/permit/drone/permit = new(T)
permit.set_name(real_name)
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
// enter_vr is called on the original mob, and puts the mind into the supplied vr mob
/mob/living/carbon/human/proc/enter_vr(var/mob/living/carbon/human/avatar) // Avatar is currently a human, because we have preexisting setup code for appearance manipulation, etc.
if(!istype(avatar))
return
// Link the two mobs for client transfer
avatar.vr_holder = src
src.teleop = avatar
src.vr_link = avatar // Can't reuse vr_holder so that death can automatically eject users from VR
// Move the mind
avatar.Sleeping(1)
src.mind.transfer_to(avatar)
to_chat(avatar, "<b>You have enterred Virtual Reality!\nAll normal gameplay rules still apply.\nWounds you suffer here won't persist when you leave VR, but some of the pain will.\nYou can leave VR at any time by using the \"Exit Virtual Reality\" verb in the Abilities tab, or by ghosting.\nYou can modify your appearance by using various \"Change \[X\]\" verbs in the Abilities tab.</b>")
to_chat(avatar, "<span class='notice'> You black out for a moment, and wake to find yourself in a new body in virtual reality.</span>") // So this is what VR feels like?
// exit_vr is called on the vr mob, and puts the mind back into the original mob
/mob/living/carbon/human/verb/exit_vr()
set name = "Exit Virtual Reality"
set category = "Abilities"
if(!vr_holder)
return
if(!mind)
return
var/total_damage
// Tally human damage
if(ishuman(src))
var/mob/living/carbon/human/H = src
total_damage = H.getBruteLoss() + H.getFireLoss() + H.getOxyLoss() + H.getToxLoss()
// Move the mind back to the original mob
// vr_holder.Sleeping(1)
src.mind.transfer_to(vr_holder)
to_chat(vr_holder, "<span class='notice'>You black out for a moment, and wake to find yourself back in your own body.</span>")
// Two-thirds damage is transferred as agony for /humans
// Getting hurt in VR doesn't damage the physical body, but you still got hurt.
if(ishuman(vr_holder) && total_damage)
var/mob/living/carbon/human/V = vr_holder
V.stun_effect_act(0, total_damage*2/3, null) // 200 damage leaves the user in paincrit for several seconds, agony reaches 0 after around 2m.
to_chat(vr_holder, "<span class='warning'>Pain from your time in VR lingers.</span>") // 250 damage leaves the user unconscious for several seconds in addition to paincrit
// Maintain a link with the mob, but don't use teleop
vr_holder.vr_link = src
vr_holder.teleop = null
if(istype(vr_holder.loc, /obj/machinery/vr_sleeper))
var/obj/machinery/vr_sleeper/V = vr_holder.loc
V.go_out()
@@ -425,9 +425,9 @@ This function restores all organs.
zone = BP_HEAD
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
if(Debug2)
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, an armor value of [blocked], and a soak value of [soaked]."
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
@@ -442,7 +442,7 @@ This function restores all organs.
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
if(organ && organ.organ_can_feel_pain())
emote("scream")
..(damage, damagetype, def_zone, blocked)
..(damage, damagetype, def_zone, blocked, soaked)
return 1
//Handle BRUTE and BURN damage
@@ -451,12 +451,18 @@ This function restores all organs.
if(blocked >= 100)
return 0
if(soaked >= damage)
return 0
if(!organ) return 0
if(blocked)
blocked = (100-blocked)/100
damage = (damage * blocked)
if(soaked)
damage -= soaked
if(Debug2)
world.log << "## DEBUG: [src] was hit for [damage]."
@@ -29,7 +29,6 @@
var/g_synth //Same as above
var/b_synth //Same as above
var/size_multiplier = 1 //multiplier for the mob's icon size
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
@@ -103,3 +102,8 @@
var/step_count = 0 // Track how many footsteps have been taken to know when to play footstep sounds
can_be_antagged = TRUE
// Used by mobs in virtual reality to point back to the "real" mob the client belongs to.
var/mob/living/carbon/human/vr_holder = null
// Used by "real" mobs after they leave a VR session
var/mob/living/carbon/human/vr_link = null
+6 -2
View File
@@ -1582,7 +1582,9 @@
if (BITTEST(hud_updateflag, LIFE_HUD))
var/image/holder = hud_list[LIFE_HUD]
if(stat == DEAD)
if(isSynthetic())
holder.icon_state = "hudrobo"
else if(stat == DEAD)
holder.icon_state = "huddead"
else
holder.icon_state = "hudhealthy"
@@ -1597,7 +1599,9 @@
var/image/holder = hud_list[STATUS_HUD]
var/image/holder2 = hud_list[STATUS_HUD_OOC]
if(stat == DEAD)
if (isSynthetic())
holder.icon_state = "hudrobo"
else if(stat == DEAD)
holder.icon_state = "huddead"
holder2.icon_state = "huddead"
else if(foundVirus)
@@ -30,6 +30,8 @@
var/tail_animation // If set, the icon to obtain tail animation states from.
var/tail_hair
var/icon_scale = 1 // Makes the icon larger/smaller.
var/race_key = 0 // Used for mob icon cache string.
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/mob_size = MOB_MEDIUM
@@ -275,11 +277,14 @@
var/t_him = "them"
if(ishuman(target))
var/mob/living/carbon/human/T = target
switch(T.identifying_gender)
if(MALE)
t_him = "him"
if(FEMALE)
t_him = "her"
if(!T.species.ambiguous_genders || (T.species.ambiguous_genders && H.species == T.species))
switch(T.identifying_gender)
if(MALE)
t_him = "him"
if(FEMALE)
t_him = "her"
else
t_him = "them"
else
switch(target.gender)
if(MALE)
@@ -148,9 +148,16 @@ var/list/wrapped_species_by_ref = list()
last_special = world.time + 50
var/new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src)
var/new_species = null
new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src)
if(!new_species || !all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
return
shapeshifter_change_shape(new_species)
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null)
if(!new_species)
return
wrapped_species_by_ref["\ref[src]"] = new_species
visible_message("<span class='notice'>\The [src] shifts and contorts, taking the form of \a [new_species]!</span>")
@@ -190,3 +197,30 @@ var/list/wrapped_species_by_ref = list()
E.sync_colour_to_human(src)
regenerate_icons()
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors()
set name = "Select Hair Colors"
set category = "Abilities"
if(stat || world.time < last_special)
return
last_special = world.time + 50
var/new_hair = input("Please select a new hair color.", "Hair Colour") as color
if(!new_hair)
return
shapeshifter_set_hair_color(new_hair)
var/new_fhair = input("Please select a new facial hair color.", "Facial Hair Color") as color
if(!new_fhair)
return
shapeshifter_set_facial_color(new_fhair)
/mob/living/carbon/human/proc/shapeshifter_set_hair_color(var/new_hair)
change_hair_color(hex2num(copytext(new_hair, 2, 4)), hex2num(copytext(new_hair, 4, 6)), hex2num(copytext(new_hair, 6, 8)))
/mob/living/carbon/human/proc/shapeshifter_set_facial_color(var/new_fhair)
change_facial_hair_color(hex2num(copytext(new_fhair, 2, 4)), hex2num(copytext(new_fhair, 4, 6)), hex2num(copytext(new_fhair, 6, 8)))
@@ -81,12 +81,12 @@ var/datum/species/shapeshifter/promethean/prometheans
/mob/living/carbon/human/proc/shapeshifter_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_gender,
/mob/living/carbon/human/proc/regenerate
)
valid_transform_species = list("Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
monochromatic = 1
valid_transform_species = list("Human", "Vatborn", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
var/heal_rate = 0.5 // Temp. Regen per tick.
@@ -39,6 +39,8 @@
burn_mod = 0.85
metabolic_rate = 0.85
item_slowdown_mod = 0.5
mob_size = MOB_LARGE
blood_volume = 840
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_UNATHI)
name_language = LANGUAGE_UNATHI
@@ -0,0 +1,32 @@
// ### Wooo, inheritance. Basically copying everything I don't need to edit from prometheans, because they mostly work already.
// ### Any and all of this is open to change for balance or whatever.
// ###
// ###
// Species definition follows.
/datum/species/shapeshifter/promethean/avatar
name = "Virtual Reality Avatar"
name_plural = "Virtual Reality Avatars"
blurb = "A 3-dimensional representation of some sort of animate object used to display the presence and actions of some-one or -thing using a virtual reality program."
show_ssd = "eerily still"
death_message = "flickers briefly, their gear falling in a heap on the floor around their motionless body."
knockout_message = "has been knocked unconscious!"
spawn_flags = SPECIES_IS_RESTRICTED
speech_bubble_appearance = "cyber"
male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime, O_EYES = /obj/item/organ/internal/eyes) // Slime core.
heal_rate = 0 // Avatars don't naturally heal like prometheans, at least not for now
/datum/species/shapeshifter/promethean/avatar/handle_death(var/mob/living/carbon/human/H)
return
/datum/species/shapeshifter/promethean/avatar/handle_environment_special(var/mob/living/carbon/human/H)
return
@@ -159,16 +159,29 @@ Please contact me on #coderbus IRC. ~Carn x
for(var/inner_entry in entry)
overlays += inner_entry
update_transform()
/mob/living/carbon/human/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
desired_scale *= species.icon_scale
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
// Regular stuff again.
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
var/matrix/M = matrix()
M.Turn(90)
M.Scale(size_multiplier)
M.Scale(desired_scale)
M.Translate(1,-6)
src.transform = M
else
var/matrix/M = matrix()
M.Scale(size_multiplier)
M.Translate(0, 16*(size_multiplier-1))
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
var/global/list/damage_icon_parts = list()
@@ -293,6 +306,8 @@ var/global/list/damage_icon_parts = list()
base_icon = chest.get_icon()
for(var/obj/item/organ/external/part in organs)
if(isnull(part) || part.is_stump())
continue
var/icon/temp = part.get_icon(skeleton)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
@@ -381,11 +396,13 @@ var/global/list/damage_icon_parts = list()
face_standing.Blend(facial_s, ICON_OVERLAY)
if(h_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
face_standing.Blend(hair_s, ICON_OVERLAY)
@@ -503,7 +520,16 @@ var/global/list/damage_icon_parts = list()
//need to append _s to the icon state for legacy compatibility
var/image/standing = image(icon = under_icon, icon_state = "[under_state]_s")
standing.color = w_uniform.color
if(w_uniform.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = w_uniform.addblends)
if(w_uniform.color)
base.Blend(w_uniform.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = w_uniform.color
//apply blood overlay
if(w_uniform.blood_DNA)
@@ -567,7 +593,15 @@ var/global/list/damage_icon_parts = list()
bloodsies.color = gloves.blood_color
standing.overlays += bloodsies
gloves.screen_loc = ui_gloves
standing.color = gloves.color
if(gloves.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = gloves.addblends)
if(gloves.color)
base.Blend(gloves.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = gloves.color
overlays_standing[GLOVES_LAYER] = standing
else
if(blood_DNA)
@@ -588,7 +622,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = glasses.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[glasses.icon_state]")
else
standing = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]")
standing.color = glasses.color
if(glasses.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = glasses.addblends)
if(glasses.color)
base.Blend(glasses.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = glasses.color
overlays_standing[GLASSES_LAYER] = standing
else
@@ -616,7 +658,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = l_ear.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[t_type]")
else
standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
standing.color = l_ear.color
if(l_ear.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = l_ear.addblends)
if(l_ear.color)
base.Blend(l_ear.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = l_ear.color
both.overlays += standing
if(r_ear)
@@ -630,7 +680,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = r_ear.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[t_type]")
else
standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
standing.color = r_ear.color
if(r_ear.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = r_ear.addblends)
if(r_ear.color)
base.Blend(r_ear.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = r_ear.color
both.overlays += standing
overlays_standing[EARS_LAYER] = both
@@ -664,8 +722,18 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
standing.color = shoes.color
if(shoes.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = shoes.addblends)
if(shoes.color)
base.Blend(shoes.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = shoes.color
overlays_standing[shoe_layer] = standing
else
if(feet_blood_DNA)
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "shoeblood")
@@ -731,7 +799,15 @@ var/global/list/damage_icon_parts = list()
if(hat.on && light_overlay_cache[cache_key])
standing.overlays |= light_overlay_cache[cache_key]
standing.color = head.color
if(head.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = head.addblends)
if(head.color)
base.Blend(head.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = head.color
overlays_standing[HEAD_LAYER] = standing
else
@@ -766,7 +842,15 @@ var/global/list/damage_icon_parts = list()
if(!i_state) i_state = i.icon_state
standing.overlays += image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[i_state]")
standing.color = belt.color
if(belt.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = belt.addblends)
if(belt.color)
base.Blend(belt.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = belt.color
overlays_standing[belt_layer] = standing
else
@@ -791,7 +875,16 @@ var/global/list/damage_icon_parts = list()
t_icon = wear_suit.item_icons[slot_wear_suit_str]
standing = image("icon" = t_icon, "icon_state" = "[wear_suit.icon_state]")
standing.color = wear_suit.color
if(wear_suit.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = wear_suit.addblends)
if(wear_suit.color)
base.Blend(wear_suit.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = wear_suit.color
if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) )
drop_from_inventory(handcuffed)
@@ -841,7 +934,15 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = wear_mask.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[wear_mask.icon_state]")
else
standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
standing.color = wear_mask.color
if(wear_mask.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = wear_mask.addblends)
if(wear_mask.color)
base.Blend(wear_mask.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = wear_mask.color
if( !istype(wear_mask, /obj/item/clothing/mask/smokable/cigarette) && wear_mask.blood_DNA )
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "maskblood")
@@ -883,7 +984,15 @@ var/global/list/damage_icon_parts = list()
//apply color
var/image/standing = image(icon = overlay_icon, icon_state = overlay_state)
standing.color = back.color
if(back.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = back.addblends)
if(back.color)
base.Blend(back.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = back.color
//create the image
overlays_standing[BACK_LAYER] = standing
+2
View File
@@ -34,6 +34,8 @@
adjustCloneLoss(damage * blocked)
if(HALLOSS)
adjustHalLoss(damage * blocked)
if(ELECTROCUTE)
electrocute_act(damage, used_weapon, 1.0, def_zone)
flash_weak_pain()
updatehealth()
return 1
+14
View File
@@ -1002,3 +1002,17 @@ default behaviour is:
// Called by job_controller.
/mob/living/proc/equip_post_job()
return
/mob/living/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
// Now for the regular stuff.
var/matrix/M = matrix()
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
+1 -15
View File
@@ -17,10 +17,6 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
/mob/living/silicon/ai/proc/toggle_hologram_movement,
/mob/living/silicon/ai/proc/toggle_hidden_verbs,
)
var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.com/1172/,
/mob/living/silicon/ai/proc/ai_announcement,
/mob/living/silicon/ai/proc/ai_call_shuttle,
/mob/living/silicon/ai/proc/ai_camera_track,
@@ -160,6 +156,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
add_language(LANGUAGE_EAL, 1)
add_language(LANGUAGE_SCHECHI, 1)
add_language(LANGUAGE_SIGN, 1)
add_language(LANGUAGE_ROOTLOCAL, 1)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
@@ -794,16 +791,5 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
if(rig)
rig.force_rest(src)
/mob/living/silicon/ai/proc/toggle_hidden_verbs()
set name = "Toggle Hidden Verbs"
set category = "AI Settings"
if(/mob/living/silicon/ai/proc/ai_announcement in verbs)
src << "Extra verbs toggled off."
verbs -= ai_verbs_hidden
else
src << "Extra verbs toggled on."
verbs |= ai_verbs_hidden
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
+2 -2
View File
@@ -430,7 +430,7 @@
user << "<span class='notice'>You add the access from the [W] to [src].</span>"
return
if("Remove Access")
idcard.access = null
idcard.access = list()
user << "<span class='notice'>You remove the access from [src].</span>"
return
if("Cancel")
@@ -442,7 +442,7 @@
/mob/living/silicon/pai/verb/allowmodification()
set name = "Change Access Modifcation Permission"
set category = "pAI Commands"
desc = "Allows people to modify your access or block people from modifying your access."
set desc = "Allows people to modify your access or block people from modifying your access."
if(idaccessible == 0)
idaccessible = 1
@@ -9,7 +9,7 @@
health = 200
mob_bump_flag = ROBOT
mob_swap_flags = ROBOT|MONKEY|SLIME|SIMPLE_ANIMAL
mob_swap_flags = ~HEAVY
mob_push_flags = ~HEAVY //trundle trundle
var/lights_on = 0 // Is our integrated light on?
@@ -394,6 +394,11 @@
C.toggled = 1
src << "<font color='red'>You enable [C.name].</font>"
/mob/living/silicon/robot/verb/spark_plug() //So you can still sparkle on demand without violence.
set category = "Robot Commands"
set name = "Emit Sparks"
spark_system.start()
// this function displays jetpack pressure in the stat panel
/mob/living/silicon/robot/proc/show_jetpack_pressure()
// if you have a jetpack, show the internal tank pressure
@@ -637,7 +642,8 @@
else
if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) )
spark_system.start()
if(W.force > 0)
spark_system.start()
return ..()
/mob/living/silicon/robot/attack_hand(mob/user)
@@ -55,6 +55,10 @@
/mob/living/simple_animal/hostile/giant_spider/proc/remove_eyes()
overlays -= eye_layer
/*
Nurse Family
*/
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
@@ -95,7 +99,105 @@
old_x = -16
old_y = -16
/mob/living/simple_animal/hostile/giant_spider/webslinger
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
icon_state = "webslinger"
icon_living = "webslinger"
icon_dead = "webslinger_dead"
maxHealth = 90
health = 90
projectilesound = 'sound/weapons/thudswoosh.ogg'
projectiletype = /obj/item/projectile/bola
ranged = 1
firing_lines = 1
cooperative = 1
shoot_range = 5
melee_damage_lower = 5
melee_damage_upper = 10
poison_per_bite = 2
poison_type = "psilocybin"
spattack_prob = 15
spattack_min_range = 0
spattack_max_range = 5
/mob/living/simple_animal/hostile/giant_spider/webslinger/AttackTarget() //One day.
var/mob/living/carbon/human/victim = null //Webslinger needs to know if its target is human later.
if(ishuman(target_mob))
victim = target_mob
if(!victim.legcuffed)
projectiletype = /obj/item/projectile/bola
shoot_range = 7
else
projectiletype = /obj/item/projectile/webball
shoot_range = 5
else
projectiletype = /obj/item/projectile/webball
shoot_range = 5
return ..()
/mob/living/simple_animal/hostile/giant_spider/carrier
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
icon_state = "carrier"
icon_living = "carrier"
icon_dead = "carrier_dead"
maxHealth = 100
health = 100
melee_damage_lower = 5
melee_damage_upper = 20
poison_per_bite = 3
poison_type = "chloralhydrate"
var/spiderling_count = 0
var/spiderling_type = /obj/effect/spider/spiderling
var/swarmling_type = /mob/living/simple_animal/hostile/giant_spider/hunter
var/swarmling_faction = "spiders"
/mob/living/simple_animal/hostile/giant_spider/carrier/New()
spiderling_count = rand(5,10)
adjust_scale(1.2)
..()
/mob/living/simple_animal/hostile/giant_spider/carrier/death()
visible_message("<span class='notice'>\The [src]'s abdomen splits as it rolls over, spiderlings crawling from the wound.</span>")
spawn(1)
for(var/I = 1 to spiderling_count)
if(prob(10) && src)
var/mob/living/simple_animal/hostile/giant_spider/swarmling = new swarmling_type(src.loc)
var/swarm_health = Floor(swarmling.maxHealth * 0.4)
var/swarm_dam_lower = Floor(melee_damage_lower * 0.4)
var/swarm_dam_upper = Floor(melee_damage_upper * 0.4)
swarmling.name = "spiderling"
swarmling.maxHealth = swarm_health
swarmling.health = swarm_health
swarmling.melee_damage_lower = swarm_dam_lower
swarmling.melee_damage_upper = swarm_dam_upper
swarmling.faction = swarmling_faction
swarmling.adjust_scale(0.75)
else if(src)
var/obj/effect/spider/spiderling/child = new spiderling_type(src.loc)
child.skitter()
else
break
return ..()
/mob/living/simple_animal/hostile/giant_spider/carrier/recursive
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. You have a distinctly <font face='comic sans ms'>bad</font> feeling about this."
swarmling_type = /mob/living/simple_animal/hostile/giant_spider/carrier/recursive
/*
Hunter Family
*/
//hunters have the most poison and move the fastest, so they can find prey
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
icon_state = "hunter"
@@ -111,6 +213,150 @@
poison_per_bite = 5
/mob/living/simple_animal/hostile/giant_spider/lurker
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
icon_state = "lurker"
icon_living = "lurker"
icon_dead = "lurker_dead"
alpha = 45
maxHealth = 100
health = 100
move_to_delay = 4
melee_damage_lower = 5
melee_damage_upper = 20
poison_chance = 20
poison_type = "cryptobiolin"
poison_per_bite = 2
/mob/living/simple_animal/hostile/giant_spider/lurker/death()
alpha = 255
return ..()
/mob/living/simple_animal/hostile/giant_spider/tunneler
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
icon_state = "tunneler"
icon_living = "tunneler"
icon_dead = "tunneler_dead"
maxHealth = 120
health = 120
move_to_delay = 4
melee_damage_lower = 10
melee_damage_upper = 20
poison_chance = 15
poison_per_bite = 3
poison_type = "serotrotium_v"
/mob/living/simple_animal/hostile/giant_spider/tunneler/death()
spawn(1)
for(var/I = 1 to rand(3,6))
if(src)
new/obj/item/weapon/ore/glass(src.loc)
else
break
return ..()
/*
Guard Family
*/
/mob/living/simple_animal/hostile/giant_spider/pepper
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
icon_state = "pepper"
icon_living = "pepper"
icon_dead = "pepper_dead"
maxHealth = 210
health = 210
melee_damage_lower = 5
melee_damage_upper = 10
poison_chance = 20
poison_per_bite = 5
poison_type = "condensedcapsaicin_v"
/mob/living/simple_animal/hostile/giant_spider/pepper/New()
adjust_scale(1.1)
..()
/mob/living/simple_animal/hostile/giant_spider/thermic
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
icon_state = "pit"
icon_living = "pit"
icon_dead = "pit_dead"
maxHealth = 175
health = 175
melee_damage_lower = 5
melee_damage_upper = 15
poison_chance = 30
poison_per_bite = 1
poison_type = "thermite_v"
/mob/living/simple_animal/hostile/giant_spider/electric
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
icon_state = "spark"
icon_living = "spark"
icon_dead = "spark_dead"
maxHealth = 210
health = 210
taser_kill = 0 //It -is- the taser.
melee_damage_lower = 5
melee_damage_upper = 10
ranged = 1
projectilesound = 'sound/weapons/taser2.ogg'
projectiletype = /obj/item/projectile/beam/stun/weak
firing_lines = 1
cooperative = 1
poison_chance = 15
poison_per_bite = 3
poison_type = "stimm"
/mob/living/simple_animal/hostile/giant_spider/phorogenic
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
icon_state = "phoron"
icon_living = "phoron"
icon_dead = "phoron_dead"
maxHealth = 225
health = 225
taser_kill = 0 //You will need more than a peashooter to kill the juggernaut.
melee_damage_lower = 10
melee_damage_upper = 20
poison_chance = 30
poison_per_bite = 0.5
poison_type = "phoron"
var/exploded = 0
/mob/living/simple_animal/hostile/giant_spider/phorogenic/New()
adjust_scale(1.25)
return ..()
/mob/living/simple_animal/hostile/giant_spider/phorogenic/death()
visible_message("<span class='danger'>\The [src]'s body begins to rupture!</span>")
spawn(rand(1,5))
if(src && !exploded)
visible_message("<span class='critical'>\The [src]'s body detonates!</span>")
exploded = 1
explosion(src.loc, 1, 2, 4, 6)
return ..()
/mob/living/simple_animal/hostile/giant_spider/frost
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
icon_state = "frost"
@@ -126,6 +372,9 @@
poison_per_bite = 5
poison_type = "cryotoxin"
/*
Spider Procs
*/
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
get_light_and_color(parent)
@@ -167,6 +416,16 @@
O.implants += eggs
to_chat(H, "<font size='3'><span class='warning'>\The [src] injects something into your [O.name]!</span></font>")
/mob/living/simple_animal/hostile/giant_spider/webslinger/DoPunch(var/atom/A)
. = ..()
if(.) // If we succeeded in hitting.
if(isliving(A))
var/mob/living/L = A
var/obj/effect/spider/stickyweb/W = locate() in get_turf(L)
if(!W && prob(75))
visible_message("<span class='danger'>\The [src] throws a layer of web at \the [L]!</span>")
new /obj/effect/spider/stickyweb(L.loc)
/mob/living/simple_animal/hostile/giant_spider/handle_stance()
. = ..()
if(ai_inactive) return
@@ -79,7 +79,7 @@
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
icon_rest = "mouse_[body_color]_sleep"
desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
@@ -95,13 +95,13 @@
if( ishuman(AM) )
if(!stat)
var/mob/M = AM
M << "<font color='blue'>\icon[src] Squeek!</font>"
M.visible_message("<font color='blue'>\icon[src] Squeek!</font>")
M << 'sound/effects/mouse_squeak.ogg'
..()
/mob/living/simple_animal/mouse/death()
layer = MOB_LAYER
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1)
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 35, 1)
if(client)
client.time_died_as_mouse = world.time
..()
@@ -90,6 +90,7 @@
var/assist_distance = 25 // Radius in which I'll ask my comrades for help.
var/supernatural = 0 // If the mob is supernatural (used in null-rod stuff for banishing?)
var/grab_resist = 75 // Chance of me resisting a grab attempt.
var/taser_kill = 1 // Is the mob weak to tasers
//Attack ranged settings
var/ranged = 0 // Do I attack at range?
@@ -107,7 +108,9 @@
var/friendly = "nuzzles" // What mobs do to people when they aren't really hostile
var/attack_sound = null // Sound to play when I attack
var/environment_smash = 0 // How much environment damage do I do when I hit stuff?
var/melee_miss_chance = 25 // percent chance to miss a melee attack.
var/melee_miss_chance = 15 // percent chance to miss a melee attack.
var/melee_attack_minDelay = 5 // How long between attacks at least
var/melee_attack_maxDelay = 10 // How long between attacks at most
//Special attacks
var/spattack_prob = 0 // Chance of the mob doing a special attack (0 for never)
@@ -501,7 +504,10 @@
stun_effect_act(0, Proj.agony)
if(!Proj.nodamage)
adjustBruteLoss(Proj.damage)
var/true_damage = Proj.damage
if(!Proj.SA_vulnerability || Proj.SA_vulnerability == intelligence_level)
true_damage += Proj.SA_bonus_damage
adjustBruteLoss(true_damage)
if(Proj.firer)
react_to_attack(Proj.firer)
@@ -1168,7 +1174,7 @@
if(!Adjacent(target_mob))
return
if(!client)
sleep(rand(8) + 8)
sleep(rand(melee_attack_minDelay, melee_attack_maxDelay))
if(isliving(target_mob))
var/mob/living/L = target_mob
@@ -1437,16 +1443,30 @@
//Shot with taser/stunvolver
/mob/living/simple_animal/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null)
var/stunDam = 0
var/agonyDam = 0
if(taser_kill)
var/stunDam = 0
var/agonyDam = 0
if(stun_amount)
stunDam += stun_amount * 0.5
adjustFireLoss(stunDam)
if(stun_amount)
stunDam += stun_amount * 0.5
adjustFireLoss(stunDam)
if(agony_amount)
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
if(agony_amount)
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
/mob/living/simple_animal/emp_act(severity)
if(!isSynthetic())
return
switch(severity)
if(1)
adjustFireLoss(rand(15, 25))
if(2)
adjustFireLoss(rand(10, 18))
if(3)
adjustFireLoss(rand(5, 12))
if(4)
adjustFireLoss(rand(1, 6))
// Force it to target something
/mob/living/simple_animal/proc/taunt(var/mob/living/new_target, var/forced = FALSE)
+1
View File
@@ -534,6 +534,7 @@
if(M != usr) return
if(usr == src) return
if(!Adjacent(usr)) return
if(usr.incapacitated(INCAPACITATION_STUNNED | INCAPACITATION_FORCELYING | INCAPACITATION_KNOCKOUT | INCAPACITATION_RESTRAINED)) return //Incapacitated.
if(istype(M,/mob/living/silicon/ai)) return
show_inv(usr)
+1 -1
View File
@@ -400,7 +400,7 @@ proc/is_blind(A)
return // Can't talk in deadchat if you can't see it.
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_eventM(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
if(M.client && (!istype(M, /mob/new_player) && M.stat == DEAD) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
if(M.forbid_seeing_deadchat && !M.client.holder)
@@ -258,7 +258,7 @@
mannequin.delete_inventory(TRUE)
dress_preview_mob(mannequin)
preview_icon = icon('icons/effects/effects.dmi', "nothing")
preview_icon = icon('icons/effects/128x48.dmi', bgstate)
preview_icon.Scale(48+32, 16+32)
mannequin.dir = NORTH
@@ -45,7 +45,8 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/Human_face.dmi' // default icon for all hairs
icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs
var/icon_add = 'icons/mob/human_face.dmi'
bald
name = "Bald"
@@ -323,7 +324,7 @@
name = "Overeye Long"
icon_state = "hair_longovereye"
fag
flowhair
name = "Flow Hair"
icon_state = "hair_f"