mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 00:23:29 +01:00
Merge remote-tracking branch 'upstream/master' into footsteps_are_good_iunno
Conflicts: code/modules/mob/living/carbon/human/human_movement.dm
This commit is contained in:
@@ -177,4 +177,19 @@
|
||||
/obj/item/weaponcrafting/stock = 1,
|
||||
/obj/item/stack/packageWrap = 5,)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 200
|
||||
time = 200
|
||||
|
||||
/datum/table_recipe/spooky_camera
|
||||
name = "Camera Obscura"
|
||||
result = /obj/item/device/camera/spooky
|
||||
time = 15
|
||||
reqs = list(/obj/item/device/camera = 1,
|
||||
/datum/reagent/holywater = 10)
|
||||
parts = list(/obj/item/device/camera = 1)
|
||||
|
||||
/datum/table_recipe/notreallysoap
|
||||
name = "Homemade Soap"
|
||||
result = /obj/item/weapon/soap/ducttape
|
||||
time = 100
|
||||
reqs = list(/obj/item/stack/tape_roll = 1,
|
||||
/datum/reagent/liquidgibs = 10)
|
||||
@@ -165,7 +165,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
|
||||
icon_state = "catfish"
|
||||
|
||||
/obj/item/weapon/fish/catfish/attackby(var/obj/item/O, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch) || istype(O, /obj/item/weapon/scalpel) || istype(O, /obj/item/weapon/kitchen/utensil/knife))
|
||||
if(is_sharp(O))
|
||||
user << "You carefully clean and gut \the [src.name]."
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src))
|
||||
@@ -184,7 +184,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
|
||||
icon_state = "salmon"
|
||||
|
||||
/obj/item/weapon/fish/salmon/attackby(var/obj/item/O, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch) || istype(O, /obj/item/weapon/scalpel) || istype(O, /obj/item/weapon/kitchen/utensil/knife))
|
||||
if(is_sharp(O))
|
||||
user << "You carefully clean and gut \the [src.name]."
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src))
|
||||
@@ -199,6 +199,15 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
|
||||
hitsound = 'sound/weapons/bite.ogg'
|
||||
force = 3
|
||||
|
||||
/obj/item/weapon/fish/babycarp/attackby(var/obj/item/O, var/mob/user as mob)
|
||||
if(is_sharp(O))
|
||||
user << "You carefully clean and gut \the [src.name]."
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(get_turf(src)) //just one fillet; this is a baby, afterall.
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/bananapeel/clownfish
|
||||
name = "clown fish"
|
||||
desc = "Even underwater, you cannot escape HONKing."
|
||||
|
||||
@@ -195,6 +195,11 @@
|
||||
|
||||
effect_str.Cut()
|
||||
effect_turf.Cut()
|
||||
|
||||
/datum/light_source/proc/forget_turf(turf/T)
|
||||
var/idx = effect_turf.Find(T)
|
||||
effect_turf.Cut(idx, idx + 1)
|
||||
effect_str.Cut(idx, idx + 1)
|
||||
|
||||
//Smartly updates the lighting, only removes lum from and adds lum to turfs that actually got changed.
|
||||
//This is for lights that need to reconsider due to nearby opacity changes.
|
||||
|
||||
@@ -18,3 +18,9 @@
|
||||
if(A.lighting_use_dynamic)
|
||||
var/atom/movable/lighting_overlay/O = new(src)
|
||||
lighting_overlay = O
|
||||
// forcibly refresh lighting on this tile
|
||||
// must make light forget tile or it wil remain
|
||||
// convinced that it is already lighting it
|
||||
for(var/datum/light_source/L in affecting_lights)
|
||||
L.forget_turf(src)
|
||||
L.vis_update()
|
||||
@@ -10,13 +10,18 @@
|
||||
// Converted to VLC for cross-platform and ogg support. - N3X
|
||||
var/const/PLAYER_HTML={"
|
||||
<embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org" />
|
||||
<object classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921" codebase="http://download.videolan.org/pub/videolan/vlc/last/win32/axvlc.cab" id="player"></object>
|
||||
<object classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921" codebase="http://download.videolan.org/pub/videolan/vlc/last/win32/axvlc.cab" version="VideoLAN.VLCPlugin.2" id="player"></object>
|
||||
<script>
|
||||
var _volume = 50;
|
||||
var vlc = document.getElementById('player');
|
||||
|
||||
function noErrorMessages () { return true; }
|
||||
window.onerror = noErrorMessages;
|
||||
function SetMusic(url, time, volume) {
|
||||
var vlc = document.getElementById('player');
|
||||
|
||||
function SetMusic(url, time, volume) {
|
||||
// scaling volume log-wise so that it's a more useful range
|
||||
_volume = Math.log(volume) / Math.LN10 * 50; // volume ranges from 0-200
|
||||
|
||||
// Stop playing
|
||||
vlc.playlist.stop();
|
||||
|
||||
@@ -30,9 +35,17 @@ function SetMusic(url, time, volume) {
|
||||
vlc.playlist.playItem(id);
|
||||
|
||||
vlc.input.time = time*1000; // VLC takes milliseconds.
|
||||
// for whatever reason, VLC plugin requires a delay between playing and setting volume
|
||||
// also scaling it log-wise so that it's a more useful range
|
||||
setTimeout(function() { vlc.audio.volume = Math.log(volume) / Math.LN10 * 50 }, 100); // volume ranges from 0-200
|
||||
}
|
||||
|
||||
function UpdateVolume() {
|
||||
vlc.audio.volume = _volume;
|
||||
}
|
||||
|
||||
// volume must be set after song already playing
|
||||
if(vlc.attachEvent) {
|
||||
vlc.attachEvent("MediaPlayerBuffering", UpdateVolume);
|
||||
} else {
|
||||
vlc.addEventListener("MediaPlayerBuffering", UpdateVolume, false);
|
||||
}
|
||||
</script>
|
||||
"}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
var/sheet_per_ore = 1
|
||||
var/point_upgrade = 1
|
||||
var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("bananium" = 30), ("diamond" = 40), ("plasma" = 40))
|
||||
var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"))
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/New()
|
||||
..()
|
||||
@@ -64,6 +65,14 @@
|
||||
var/obj/item/stack/sheet/s = new processed_sheet(src,0)
|
||||
s.amount = 0
|
||||
stack_list[processed_sheet] = s
|
||||
// Not including tg's ignoring of metal, glass being stocked because if cargo's not telling science when ores are there, they probably won't
|
||||
// help with restocking metal/glass either
|
||||
var/msg = "[capitalize(s.name)] sheets have been stocked in the ore reclaimer."
|
||||
for(var/obj/machinery/requests_console/D in allConsoles)
|
||||
if(D.department in src.supply_consoles)
|
||||
if(supply_consoles[D.department] == null || (s.name in supply_consoles[D.department]))
|
||||
D.createMessage("Ore Redemption Machine", "New Minerals Available!", msg, 1)
|
||||
|
||||
var/obj/item/stack/sheet/storage = stack_list[processed_sheet]
|
||||
storage.amount += sheet_per_ore //Stack the sheets
|
||||
O.loc = null //Let the old sheet...
|
||||
@@ -873,4 +882,4 @@
|
||||
desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
|
||||
volume = 40
|
||||
throw_range = 7
|
||||
w_class = 3 //same as syndie harness
|
||||
w_class = 3 //same as syndie harness
|
||||
|
||||
@@ -4,20 +4,21 @@
|
||||
voice_name = "unknown"
|
||||
icon = 'icons/mob/human.dmi'
|
||||
icon_state = "body_m_s"
|
||||
|
||||
//why are these here and not in human_defines.dm
|
||||
var/list/hud_list[10]
|
||||
var/datum/species/species //Contains icon generation and language information, set during New().
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0)
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0)
|
||||
if(!dna)
|
||||
dna = new /datum/dna(null)
|
||||
// Species name is handled by set_species()
|
||||
|
||||
if(!species)
|
||||
if(new_species)
|
||||
set_species(new_species,1)
|
||||
set_species(new_species, 1)
|
||||
else
|
||||
set_species()
|
||||
|
||||
@@ -44,7 +45,7 @@
|
||||
make_blood()
|
||||
|
||||
var/mob/M = src
|
||||
faction |= "\ref[M]"
|
||||
faction |= "\ref[M]" //what
|
||||
|
||||
// Set up DNA.
|
||||
if(!delay_ready_dna && dna)
|
||||
@@ -146,30 +147,37 @@
|
||||
/mob/living/carbon/human/stok/New(var/new_loc)
|
||||
..(new_loc, "Stok")
|
||||
|
||||
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing || buckled))
|
||||
return
|
||||
/mob/living/carbon/human/Bump(atom/movable/AM, yes)
|
||||
if(!(yes) || now_pushing || buckled)
|
||||
return 0
|
||||
now_pushing = 1
|
||||
if (ismob(AM))
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
|
||||
if( istype(tmob, /mob/living/carbon) && prob(10) )
|
||||
src.spread_disease_to(AM, "Contact")
|
||||
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
if(iscarbon(tmob) && prob(10))
|
||||
spread_disease_to(tmob, "Contact")
|
||||
|
||||
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
||||
//i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap'
|
||||
if(ishuman(tmob))
|
||||
for(var/mob/M in range(tmob, 1))
|
||||
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restrained, you cannot push past"
|
||||
|
||||
if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS))
|
||||
if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human
|
||||
src << "<span class='danger'>[tmob] is restrained, you cannot push past.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restraining [M], you cannot push past"
|
||||
return 0
|
||||
|
||||
//I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had
|
||||
//locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it
|
||||
//FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE()
|
||||
//SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD
|
||||
|
||||
if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS)
|
||||
if(!(world.time % 5))
|
||||
src << "<span class='danger'>[tmob] is restraining [M], you cannot push past.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
return 0
|
||||
|
||||
//Leaping mobs just land on the tile, no pushing, no anything.
|
||||
if(status_flags & LEAPING)
|
||||
@@ -178,35 +186,35 @@
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it?
|
||||
loc = tmob.loc
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
|
||||
if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()) && tmob.canmove && canmove && !tmob.buckled && !tmob.buckled_mob) // mutual brohugs all around!
|
||||
var/turf/oldloc = loc
|
||||
loc = tmob.loc
|
||||
tmob.loc = oldloc
|
||||
now_pushing = 0
|
||||
for(var/mob/living/carbon/slime/slime in view(1,tmob))
|
||||
if(slime.Victim == tmob)
|
||||
slime.UpdateFeed()
|
||||
return
|
||||
//it might be 'bubblewrapping' given that this rhymes with 'hugboxing'
|
||||
if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()))
|
||||
if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob))
|
||||
var/turf/oldloc = loc
|
||||
loc = tmob.loc
|
||||
tmob.loc = oldloc
|
||||
now_pushing = 0
|
||||
for(var/mob/living/carbon/slime/slime in view(1,tmob))
|
||||
if(slime.Victim == tmob)
|
||||
slime.UpdateFeed()
|
||||
return
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(ishuman(tmob) && (FAT in tmob.mutations))
|
||||
if(prob(40) && !(FAT in src.mutations))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
src << "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
@@ -216,21 +224,19 @@
|
||||
now_pushing = 0
|
||||
spawn(0)
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
if(!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!now_pushing)
|
||||
if(!now_pushing)
|
||||
now_pushing = 1
|
||||
|
||||
if (!AM.anchored)
|
||||
if(!AM.anchored)
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window/full))
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
if(istype(AM, /obj/structure/window/full))
|
||||
for(var/obj/structure/window/win in get_step(AM, t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = 0
|
||||
return
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/Stat()
|
||||
..()
|
||||
@@ -246,11 +252,11 @@
|
||||
if(eta_status)
|
||||
stat(null, eta_status)
|
||||
|
||||
if (client.statpanel == "Status")
|
||||
if(client.statpanel == "Status")
|
||||
if(locate(/obj/item/device/assembly/health) in src)
|
||||
stat(null, "Health: [health]")
|
||||
if (internal)
|
||||
if (!internal.air_contents)
|
||||
if(internal)
|
||||
if(!internal.air_contents)
|
||||
qdel(internal)
|
||||
else
|
||||
stat("Internal Atmosphere Info", internal.name)
|
||||
@@ -279,12 +285,13 @@
|
||||
var/shielded = 0
|
||||
var/b_loss = null
|
||||
var/f_loss = null
|
||||
switch (severity)
|
||||
if (1.0)
|
||||
|
||||
switch(severity)
|
||||
if(1)
|
||||
b_loss += 500
|
||||
if (!prob(getarmor(null, "bomb")))
|
||||
if(!prob(getarmor(null, "bomb")))
|
||||
gib()
|
||||
return
|
||||
return 0
|
||||
else
|
||||
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
|
||||
throw_at(target, 200, 4)
|
||||
@@ -301,13 +308,8 @@
|
||||
limbs_affected -= 1
|
||||
else valid_limbs -= processing_dismember
|
||||
|
||||
|
||||
//return
|
||||
// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
|
||||
//user.throw_at(target, 200, 4)
|
||||
|
||||
if (2.0)
|
||||
if (!shielded)
|
||||
if(2)
|
||||
if(!shielded) //literally nothing could change shielded before this so wth
|
||||
b_loss += 60
|
||||
|
||||
f_loss += 60
|
||||
@@ -316,7 +318,7 @@
|
||||
var/obj/item/organ/external/processing_dismember
|
||||
var/list/valid_limbs = organs.Copy()
|
||||
|
||||
if (prob(getarmor(null, "bomb")))
|
||||
if(prob(getarmor(null, "bomb")))
|
||||
b_loss = b_loss/1.5
|
||||
f_loss = f_loss/1.5
|
||||
|
||||
@@ -332,15 +334,15 @@
|
||||
limbs_affected -= 1
|
||||
else valid_limbs -= processing_dismember
|
||||
|
||||
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
ear_damage += 30
|
||||
ear_deaf += 120
|
||||
if (prob(70) && !shielded)
|
||||
if(prob(70) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
if(3.0)
|
||||
if(3)
|
||||
b_loss += 30
|
||||
if (prob(getarmor(null, "bomb")))
|
||||
if(prob(getarmor(null, "bomb")))
|
||||
b_loss = b_loss/2
|
||||
|
||||
else
|
||||
@@ -357,10 +359,10 @@
|
||||
limbs_affected -= 1
|
||||
else valid_limbs -= processing_dismember
|
||||
|
||||
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
ear_damage += 15
|
||||
ear_deaf += 60
|
||||
if (prob(50) && !shielded)
|
||||
if(prob(50) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
var/update = 0
|
||||
@@ -368,19 +370,19 @@
|
||||
for(var/obj/item/organ/external/temp in organs)
|
||||
switch(temp.limb_name)
|
||||
if("head")
|
||||
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
||||
if("chest")
|
||||
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
|
||||
if("groin")
|
||||
update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
|
||||
if("l_arm")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_arm")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("l_leg")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_leg")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_foot")
|
||||
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
|
||||
if("l_foot")
|
||||
@@ -394,12 +396,12 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/blob_act()
|
||||
if(stat == DEAD) return
|
||||
if(stat == DEAD)
|
||||
return
|
||||
show_message("<span class='userdanger'>The blob attacks you!</span>")
|
||||
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
@@ -1838,9 +1840,9 @@
|
||||
/mob/living/carbon/human/proc/get_full_print()
|
||||
if(!dna || !dna.uni_identity)
|
||||
return
|
||||
return md5(dna.uni_identity)
|
||||
return md5(dna.uni_identity)
|
||||
|
||||
/mob/living/carbon/human/can_see_reagents()
|
||||
for(var/obj/item/clothing/C in src) //If they have some clothing equipped that lets them see reagents, they can see reagents
|
||||
if(C.scan_reagents)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -1,51 +1,50 @@
|
||||
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(check_shields(0, M.name))
|
||||
visible_message("\red <B>[M] attempted to touch [src]!</B>")
|
||||
visible_message("<span class='danger'>[M] attempted to touch [src]!</span>")
|
||||
return 0
|
||||
|
||||
switch(M.a_intent)
|
||||
if (I_HELP)
|
||||
visible_message(text("\blue [M] caresses [src] with its scythe like arm."))
|
||||
if (I_GRAB)
|
||||
if(I_HELP)
|
||||
visible_message("<span class='notice'>[M] caresses [src] with its scythe like arm.</span>")
|
||||
|
||||
if(I_GRAB)
|
||||
grabbedby(M)
|
||||
|
||||
if(I_HARM)
|
||||
M.do_attack_animation(src)
|
||||
if (w_uniform)
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
|
||||
var/damage = rand(15, 30)
|
||||
if(!damage)
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
|
||||
visible_message("\red <B>[M] has lunged at [src]!</B>")
|
||||
visible_message("<span class='danger'>[M] has lunged at [src]!</span>")
|
||||
return 0
|
||||
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
visible_message("\red <B>[M] has slashed at [src]!</B>")
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>")
|
||||
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
if (damage >= 25)
|
||||
visible_message("\red <B>[M] has wounded [src]!</B>")
|
||||
if(damage >= 25)
|
||||
visible_message("<span class='danger'>[M] has wounded [src]!</span>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
updatehealth()
|
||||
|
||||
if(I_DISARM)
|
||||
M.do_attack_animation(src)
|
||||
var/randn = rand(1, 100)
|
||||
if (randn <= 80)
|
||||
if(prob(80))
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
|
||||
apply_effect(5, WEAKEN, run_armor_check(affecting, "melee"))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has tackled down []!</B>", M, src), 1)
|
||||
visible_message("<span class='danger'>[M] has tackled down [src]!</span>")
|
||||
else
|
||||
if (randn <= 99)
|
||||
if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)'
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
drop_item()
|
||||
visible_message(text("\red <B>[] disarmed []!</B>", M, src))
|
||||
visible_message("<span class='danger'>[M] disarmed [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
|
||||
visible_message(text("\red <B>[] has tried to disarm []!</B>", M, src))
|
||||
return
|
||||
visible_message("<span class='danger'>[M] has tried to disarm [src]!</span>")
|
||||
@@ -4,26 +4,30 @@
|
||||
health = 100
|
||||
stat = CONSCIOUS
|
||||
return
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
|
||||
for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
|
||||
total_brute += O.brute_dam
|
||||
total_brute += O.brute_dam //calculates health based on organ brute and burn
|
||||
total_burn += O.burn_dam
|
||||
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
|
||||
|
||||
//TODO: fix husking
|
||||
if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
|
||||
ChangeToHusk()
|
||||
if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number
|
||||
ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS
|
||||
if(species.can_revive_by_healing)
|
||||
var/obj/item/organ/brain/B = internal_organs_by_name["brain"]
|
||||
if(B)
|
||||
if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD)
|
||||
if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD)
|
||||
update_revive()
|
||||
if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
|
||||
if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
|
||||
update_revive()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/adjustBrainLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
|
||||
if(species && species.has_organ["brain"])
|
||||
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -36,7 +40,8 @@
|
||||
brainloss = 0
|
||||
|
||||
/mob/living/carbon/human/setBrainLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
|
||||
if(species && species.has_organ["brain"])
|
||||
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -49,7 +54,8 @@
|
||||
brainloss = 0
|
||||
|
||||
/mob/living/carbon/human/getBrainLoss()
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
|
||||
if(species && species.has_organ["brain"])
|
||||
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -143,34 +149,39 @@
|
||||
return
|
||||
|
||||
var/heal_prob = max(0, 80 - getCloneLoss())
|
||||
var/mut_prob = min(80, getCloneLoss()+10)
|
||||
if (amount > 0)
|
||||
if (prob(mut_prob))
|
||||
var/list/obj/item/organ/external/candidates = list()
|
||||
for (var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_ROBOT) continue
|
||||
var/mut_prob = min(80, getCloneLoss() + 10)
|
||||
if(amount > 0) //cloneloss is being added
|
||||
if(prob(mut_prob))
|
||||
var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_ROBOT)
|
||||
continue
|
||||
if(!(O.status & ORGAN_MUTATED))
|
||||
candidates |= O
|
||||
if (candidates.len)
|
||||
|
||||
if(candidates.len)
|
||||
var/obj/item/organ/external/O = pick(candidates)
|
||||
O.mutate()
|
||||
src << "<span class = 'notice'>Something is not right with your [O.name]...</span>"
|
||||
src << "<span class='notice'>Something is not right with your [O.name]...</span>"
|
||||
O.add_autopsy_data("Mutation", amount)
|
||||
return
|
||||
else
|
||||
if (prob(heal_prob))
|
||||
for (var/obj/item/organ/external/O in organs)
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
|
||||
else //cloneloss is being subtracted
|
||||
if(prob(heal_prob))
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
|
||||
src << "<span class='notice'>Your [O.name] is shaped normally again.</span>"
|
||||
return
|
||||
|
||||
if (getCloneLoss() < 1)
|
||||
for (var/obj/item/organ/external/O in organs)
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
|
||||
if(getCloneLoss() < 1) //no cloneloss, fixes organs
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
src << "<span class='notice'>Your [O.name] is shaped normally again.</span>"
|
||||
|
||||
hud_updateflag |= 1 << HEALTH_HUD //what even is this shit
|
||||
|
||||
// Defined here solely to take species flags into account without having to recast at mob/living level.
|
||||
/mob/living/carbon/human/getOxyLoss()
|
||||
@@ -186,7 +197,7 @@
|
||||
|
||||
/mob/living/carbon/human/setOxyLoss(var/amount)
|
||||
if(species.flags & NO_BREATHE)
|
||||
oxyloss = 0
|
||||
oxyloss = 0 //this literally overrides three procs, excessive much?
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -203,7 +214,7 @@
|
||||
|
||||
/mob/living/carbon/human/setToxLoss(var/amount)
|
||||
if(species.flags & NO_POISON)
|
||||
toxloss = 0
|
||||
toxloss = 0 //this *also* overrides three procs, definately excessive
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -230,7 +241,8 @@
|
||||
//It automatically updates health status
|
||||
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
|
||||
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
|
||||
if(!parts.len) return
|
||||
if(!parts.len)
|
||||
return
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
if(picked.heal_damage(brute,burn))
|
||||
UpdateDamageIcon()
|
||||
@@ -242,7 +254,8 @@
|
||||
//It automatically updates health status
|
||||
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
|
||||
var/list/obj/item/organ/external/parts = get_damageable_organs()
|
||||
if(!parts.len) return
|
||||
if(!parts.len)
|
||||
return
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
if(picked.take_damage(brute,burn,sharp,edge))
|
||||
UpdateDamageIcon()
|
||||
@@ -252,31 +265,35 @@
|
||||
|
||||
|
||||
//Heal MANY external organs, in random order
|
||||
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
|
||||
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn, var/internal=0, var/robotic=0)
|
||||
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
|
||||
|
||||
var/update = 0
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
while(parts.len && ( brute > 0 || burn > 0) )
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
|
||||
var/brute_was = picked.brute_dam
|
||||
var/burn_was = picked.burn_dam
|
||||
|
||||
update |= picked.heal_damage(brute,burn)
|
||||
update |= picked.heal_damage(brute,burn, internal, robotic)
|
||||
|
||||
brute -= (brute_was-picked.brute_dam)
|
||||
burn -= (burn_was-picked.burn_dam)
|
||||
|
||||
parts -= picked
|
||||
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
speech_problem_flag = 1
|
||||
if(update) UpdateDamageIcon()
|
||||
if(update)
|
||||
UpdateDamageIcon()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
|
||||
if(status_flags & GODMODE) return //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return //godmode
|
||||
var/list/obj/item/organ/external/parts = get_damageable_organs()
|
||||
|
||||
var/update = 0
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
@@ -289,9 +306,11 @@
|
||||
burn -= (picked.burn_dam - burn_was)
|
||||
|
||||
parts -= picked
|
||||
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
if(update) UpdateDamageIcon()
|
||||
if(update)
|
||||
UpdateDamageIcon()
|
||||
|
||||
|
||||
////////////////////////////////////////////
|
||||
@@ -302,7 +321,7 @@ This function restores the subjects blood to max.
|
||||
/mob/living/carbon/human/proc/restore_blood()
|
||||
if(!(species.flags & NO_BLOOD))
|
||||
var/blood_volume = vessel.get_reagent_amount("blood")
|
||||
vessel.add_reagent("blood",560.0-blood_volume)
|
||||
vessel.add_reagent("blood", 560.0 - blood_volume)
|
||||
|
||||
/*
|
||||
This function restores all organs.
|
||||
@@ -314,47 +333,43 @@ This function restores all organs.
|
||||
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
|
||||
var/obj/item/organ/external/E = get_organ(zone)
|
||||
if(istype(E, /obj/item/organ/external))
|
||||
if (E.heal_damage(brute, burn))
|
||||
if(E.heal_damage(brute, burn))
|
||||
UpdateDamageIcon()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
else
|
||||
return 0
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/get_organ(var/zone)
|
||||
if(!zone) zone = "chest"
|
||||
if (zone in list( "eyes", "mouth" ))
|
||||
if(!zone)
|
||||
zone = "chest"
|
||||
if(zone in list("eyes", "mouth"))
|
||||
zone = "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)
|
||||
|
||||
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
|
||||
|
||||
//Handle other types of damage
|
||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||
if(damagetype == HALLOSS)
|
||||
if ((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
|
||||
emote("scream")
|
||||
|
||||
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
|
||||
//Handle BRUTE and BURN damage
|
||||
handle_suit_punctures(damagetype, damage)
|
||||
|
||||
blocked = (100-blocked)/100
|
||||
if(blocked <= 0) return 0
|
||||
blocked = (100 - blocked) / 100
|
||||
if(blocked <= 0)
|
||||
return 0
|
||||
|
||||
var/obj/item/organ/external/organ = null
|
||||
if(isorgan(def_zone))
|
||||
organ = def_zone
|
||||
else
|
||||
if(!def_zone) def_zone = ran_zone(def_zone)
|
||||
if(!def_zone)
|
||||
def_zone = ran_zone(def_zone)
|
||||
organ = get_organ(check_zone(def_zone))
|
||||
if(!organ) return 0
|
||||
if(!organ)
|
||||
return 0
|
||||
|
||||
damage = damage * blocked
|
||||
|
||||
@@ -362,28 +377,33 @@ This function restores all organs.
|
||||
if(BRUTE)
|
||||
damageoverlaytemp = 20
|
||||
if(species && species.brute_mod)
|
||||
damage = damage*species.brute_mod
|
||||
damage = damage * species.brute_mod
|
||||
|
||||
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
|
||||
UpdateDamageIcon()
|
||||
if(LAssailant && ishuman(LAssailant))
|
||||
|
||||
if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers
|
||||
var/mob/living/carbon/human/H = LAssailant
|
||||
if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts))
|
||||
var/list/attack_bubble_recipients = list()
|
||||
var/mob/living/user
|
||||
for(var/mob/O in viewers(user, src))
|
||||
if (O.client && !( O.blinded ))
|
||||
if (O.client && !(O.blinded))
|
||||
attack_bubble_recipients.Add(O.client)
|
||||
spawn(0)
|
||||
var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1)
|
||||
dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12)
|
||||
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
|
||||
//world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]"
|
||||
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
|
||||
|
||||
receive_damage()
|
||||
|
||||
if(BURN)
|
||||
damageoverlaytemp = 20
|
||||
|
||||
if(species && species.burn_mod)
|
||||
damage = damage*species.burn_mod
|
||||
damage = damage * species.burn_mod
|
||||
|
||||
if(organ.take_damage(0, damage, sharp, edge, used_weapon))
|
||||
UpdateDamageIcon()
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(status_flags & GOTTAGOREALLYFAST)
|
||||
tally -= 2
|
||||
|
||||
return (tally+config.human_delay)
|
||||
return (tally + config.human_delay)
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
if(!lying && !buckled)
|
||||
if(!has_gravity(loc))
|
||||
return
|
||||
var/obj/item/clothing/shoes/S = shoes
|
||||
var/obj/item/clothing/shoes/S = shoes
|
||||
S.step_action(src)
|
||||
|
||||
/mob/living/carbon/human/handle_footstep(turf/T)
|
||||
|
||||
@@ -136,6 +136,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
var/y_offset = pixel_y + rand(-1,1)
|
||||
animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1)
|
||||
|
||||
if (disabilities & NERVOUS)
|
||||
speech_problem_flag = 1
|
||||
if (prob(10))
|
||||
@@ -143,12 +144,38 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
|
||||
if (getBrainLoss() >= 60 && stat != 2)
|
||||
speech_problem_flag = 1
|
||||
if (prob(3))
|
||||
if(prob(3))
|
||||
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
|
||||
"without oxigen blob don't evoluate?",
|
||||
"CAPTAINS A COMDOM",
|
||||
"[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
|
||||
"can u give me [pick("telikesis","halk","eppilapse")]?",
|
||||
"THe saiyans screwed",
|
||||
"Bi is THE BEST OF BOTH WORLDS>",
|
||||
"I WANNA PET TEH monkeyS",
|
||||
"stop grifing me!!!!",
|
||||
"SOTP IT#")
|
||||
|
||||
var/list/s2 = list("FUS RO DAH",
|
||||
"fucking 4rries!",
|
||||
"stat me",
|
||||
">my face",
|
||||
"roll it easy!",
|
||||
"waaaaaagh!!!",
|
||||
"red wonz go fasta",
|
||||
"FOR TEH EMPRAH",
|
||||
"lol2cat",
|
||||
"dem dwarfs man, dem dwarfs",
|
||||
"SPESS MAHREENS",
|
||||
"hwee did eet fhor khayosss",
|
||||
"lifelike texture ;_;",
|
||||
"luv can bloooom",
|
||||
"PACKETS!!!")
|
||||
switch(pick(1,2,3))
|
||||
if(1)
|
||||
say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
|
||||
say(pick(s1))
|
||||
if(2)
|
||||
say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!"))
|
||||
say(pick(s2))
|
||||
if(3)
|
||||
emote("drool")
|
||||
|
||||
|
||||
@@ -499,7 +499,7 @@
|
||||
|
||||
passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON
|
||||
clothing_flags = HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR
|
||||
dietflags = 0 //IPCs can't eat, so no diet
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
pass_flags = PASSTABLE
|
||||
braintype = "Robot"
|
||||
lawupdate = 0
|
||||
density = 1
|
||||
density = 0
|
||||
req_access = list(access_engine, access_robotics)
|
||||
local_transmit = 1
|
||||
|
||||
@@ -335,4 +335,8 @@
|
||||
src.verbs |= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/robot/drone/remove_robot_verbs()
|
||||
src.verbs -= silicon_subsystems
|
||||
src.verbs -= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/robot/drone/update_canmove()
|
||||
. = ..()
|
||||
density = 0 //this is reset every canmove update otherwise
|
||||
@@ -709,9 +709,8 @@
|
||||
|
||||
message = capitalize(trim_left(message))
|
||||
if(message_mode)
|
||||
if(message_mode in radiochannels)
|
||||
if(ears && istype(ears,/obj/item/device/radio))
|
||||
ears.talk_into(src, message, message_mode, verb, null)
|
||||
if(ears && istype(ears,/obj/item/device/radio))
|
||||
ears.talk_into(src, message, message_mode, verb, null)
|
||||
|
||||
..(message)
|
||||
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
max_damage = 50 //made same as arm, since it is not vital
|
||||
min_broken_damage = 30
|
||||
encased = null
|
||||
|
||||
|
||||
/obj/item/organ/external/head/ipc/New()
|
||||
robotize("Morpheus Cyberkinetics")
|
||||
..()
|
||||
|
||||
/obj/item/organ/external/chest/ipc
|
||||
encased = null
|
||||
|
||||
|
||||
/obj/item/organ/external/chest/ipc/New()
|
||||
robotize("Morpheus Cyberkinetics")
|
||||
..()
|
||||
@@ -91,6 +91,7 @@
|
||||
organ_tag = "brain"
|
||||
parent_organ = "chest"
|
||||
vital = 1
|
||||
max_damage = 200
|
||||
var/obj/item/device/mmi/stored_mmi
|
||||
|
||||
/obj/item/organ/mmi_holder/proc/update_from_mmi()
|
||||
|
||||
@@ -150,6 +150,24 @@
|
||||
var/icon_on = "camera"
|
||||
var/icon_off = "camera_off"
|
||||
var/size = 3
|
||||
var/see_ghosts = 0 //for the spoop of it
|
||||
|
||||
|
||||
/obj/item/device/camera/spooky/CheckParts()
|
||||
var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents
|
||||
if(C)
|
||||
pictures_max = C.pictures_max
|
||||
pictures_left = C.pictures_left
|
||||
visible_message("[C] has been imbued with godlike power!")
|
||||
qdel(C)
|
||||
|
||||
|
||||
var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","shadow","ghostian2")
|
||||
|
||||
/obj/item/device/camera/spooky
|
||||
name = "camera obscura"
|
||||
desc = "A polaroid camera, some say it can see ghosts!"
|
||||
see_ghosts = 1
|
||||
|
||||
/obj/item/device/camera/verb/change_size()
|
||||
set name = "Set Photo Focus"
|
||||
@@ -184,7 +202,7 @@
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/camera/proc/get_icon(list/turfs, turf/center)
|
||||
/obj/item/device/camera/proc/get_icon(list/turfs, turf/center,mob/user)
|
||||
|
||||
//Bigger icon base to capture those icons that were shifted to the next tile
|
||||
//i.e. pretty much all wall-mounted machinery
|
||||
@@ -199,8 +217,20 @@
|
||||
atoms.Add(the_turf);
|
||||
// As well as anything that isn't invisible.
|
||||
for(var/atom/A in the_turf)
|
||||
if(A.invisibility) continue
|
||||
atoms.Add(A)
|
||||
if(A.invisibility )
|
||||
if(see_ghosts && istype(A,/mob/dead/observer))
|
||||
var/mob/dead/observer/O = A
|
||||
if(O.following)
|
||||
continue
|
||||
if(user.mind && !(user.mind.assigned_role == "Chaplain"))
|
||||
atoms.Add(image('icons/mob/mob.dmi', O.loc, pick(SpookyGhosts), 4, SOUTH))
|
||||
else
|
||||
atoms.Add(image('icons/mob/mob.dmi', O.loc, "ghost", 4, SOUTH))
|
||||
else//its not a ghost
|
||||
continue
|
||||
else//not invisable, not a spookyghost add it.
|
||||
atoms.Add(A)
|
||||
|
||||
|
||||
// Sort the atoms into their layers
|
||||
var/list/sorted = sort_atoms_by_layer(atoms)
|
||||
@@ -235,21 +265,35 @@
|
||||
|
||||
/obj/item/device/camera/proc/get_mobs(turf/the_turf as turf)
|
||||
var/mob_detail
|
||||
for(var/mob/living/carbon/A in the_turf)
|
||||
if(A.invisibility) continue
|
||||
var/holding = null
|
||||
if(A.l_hand || A.r_hand)
|
||||
if(A.l_hand) holding = "They are holding \a [A.l_hand]"
|
||||
if(A.r_hand)
|
||||
if(holding)
|
||||
holding += " and \a [A.r_hand]"
|
||||
for(var/mob/M in the_turf)
|
||||
if(M.invisibility)
|
||||
if(see_ghosts && istype(M,/mob/dead/observer))
|
||||
var/mob/dead/observer/O = M
|
||||
if(O.following)
|
||||
continue
|
||||
if(!mob_detail)
|
||||
mob_detail = "You can see a g-g-g-g-ghooooost! "
|
||||
else
|
||||
holding = "They are holding \a [A.r_hand]"
|
||||
mob_detail += "You can also see a g-g-g-g-ghooooost!"
|
||||
else
|
||||
continue
|
||||
|
||||
if(!mob_detail)
|
||||
mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. "
|
||||
else
|
||||
mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
|
||||
var/holding = null
|
||||
|
||||
if(istype(M, /mob/living/carbon))
|
||||
var/mob/living/carbon/A = M
|
||||
if(A.l_hand || A.r_hand)
|
||||
if(A.l_hand) holding = "They are holding \a [A.l_hand]"
|
||||
if(A.r_hand)
|
||||
if(holding)
|
||||
holding += " and \a [A.r_hand]"
|
||||
else
|
||||
holding = "They are holding \a [A.r_hand]"
|
||||
|
||||
if(!mob_detail)
|
||||
mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. "
|
||||
else
|
||||
mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
|
||||
return mob_detail
|
||||
|
||||
/obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
|
||||
@@ -263,6 +307,9 @@
|
||||
user << "<span class='notice'>[pictures_left] photos left.</span>"
|
||||
icon_state = icon_off
|
||||
on = 0
|
||||
if(user.mind && !(user.mind.assigned_role == "Chaplain"))
|
||||
if(prob(24))
|
||||
handle_haunt(user)
|
||||
spawn(64)
|
||||
icon_state = icon_on
|
||||
on = 1
|
||||
@@ -298,7 +345,7 @@
|
||||
printpicture(user, P)
|
||||
|
||||
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
|
||||
var/icon/photoimage = get_icon(turfs, target)
|
||||
var/icon/photoimage = get_icon(turfs, target,user)
|
||||
|
||||
var/icon/small_img = icon(photoimage)
|
||||
var/icon/tiny_img = icon(photoimage)
|
||||
@@ -483,3 +530,15 @@
|
||||
talk_into(M, msg)
|
||||
for(var/mob/living/carbon/human/H in watcherslist)
|
||||
H.show_message(text("\blue (Newscaster) [] says, '[]'",M,msg), 1)
|
||||
|
||||
|
||||
|
||||
///hauntings, like hallucinations but more spooky
|
||||
|
||||
/obj/item/device/camera/proc/handle_haunt(mob/user as mob)
|
||||
var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
|
||||
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
|
||||
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
|
||||
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
|
||||
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
|
||||
user << pick(creepyasssounds)
|
||||
|
||||
@@ -521,7 +521,7 @@
|
||||
M.drop_item()
|
||||
..()
|
||||
if(prob(50))
|
||||
M.adjustToxLoss(10)
|
||||
M.adjustFireLoss(10)
|
||||
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
|
||||
return
|
||||
|
||||
@@ -551,7 +551,7 @@
|
||||
/datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
|
||||
M.Jitter(20)
|
||||
M.Dizzy(20)
|
||||
M.adjustToxLoss(5)
|
||||
M.adjustBrainLoss(2)
|
||||
if(prob(50))
|
||||
M.emote(pick("twitch","buzz","moan"))
|
||||
..()
|
||||
@@ -605,7 +605,7 @@
|
||||
|
||||
/datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(rand(1,5)*REM)
|
||||
M.adjustToxLoss(rand(1,5)*REM)
|
||||
M.hallucination += rand(1,5)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob)
|
||||
|
||||
@@ -96,7 +96,7 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo
|
||||
datum/reagent/synthflesh/reaction_turf(var/turf/T, var/volume) //let's make a mess!
|
||||
src = null
|
||||
if(volume >= 5)
|
||||
new /obj/effect/decal/cleanable/blood/gibs(T)
|
||||
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
|
||||
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
|
||||
return
|
||||
|
||||
@@ -987,7 +987,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
|
||||
// Synth-Meds //
|
||||
//////////////////////////////
|
||||
|
||||
//Degreaser: Anti-toxin / Lube Remover
|
||||
//Degreaser: Mild Purgative / Lube Remover
|
||||
/datum/reagent/degreaser
|
||||
name = "Degreaser"
|
||||
id = "degreaser"
|
||||
@@ -1016,7 +1016,11 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
|
||||
|
||||
/datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.adjustToxLoss(-1.5*REM)
|
||||
if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis
|
||||
M.AdjustParalysis(-1)
|
||||
M.AdjustStunned(-1)
|
||||
M.AdjustWeakened(-1)
|
||||
M.confused -= 5
|
||||
for(var/datum/reagent/R in M.reagents.reagent_list)
|
||||
if(R != src)
|
||||
if(R.id == "ultralube" || R.id == "lube")
|
||||
|
||||
@@ -47,6 +47,8 @@ datum/reagents/proc/metabolize(var/mob/M)
|
||||
R.overdosed = 1
|
||||
M << "<span class = 'userdanger'>You feel like you took too much [R.name]!</span>"
|
||||
R.overdose_start(M)
|
||||
if(R.volume < R.overdose_threshold && R.overdosed)
|
||||
R.overdosed = 0
|
||||
if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0)
|
||||
var/datum/reagent/new_reagent = new R.type()
|
||||
addiction_list.Add(new_reagent)
|
||||
|
||||
@@ -305,6 +305,53 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
|
||||
return
|
||||
|
||||
|
||||
/datum/chemical_reaction/soapification
|
||||
name = "Soapification"
|
||||
id = "soapification"
|
||||
result = null
|
||||
required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles
|
||||
min_temp = 374
|
||||
result_amount = 1
|
||||
|
||||
|
||||
/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
new /obj/item/weapon/soap/homemade(location)
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/candlefication
|
||||
name = "Candlefication"
|
||||
id = "candlefication"
|
||||
result = null
|
||||
required_reagents = list("liquidgibs" = 5, "oxygen" = 5) //
|
||||
min_temp = 374
|
||||
result_amount = 1
|
||||
|
||||
/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
new /obj/item/candle(location)
|
||||
return
|
||||
|
||||
|
||||
/datum/chemical_reaction/meatification
|
||||
name = "Meatification"
|
||||
id = "meatification"
|
||||
result = null
|
||||
required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10)
|
||||
result_amount = 1
|
||||
|
||||
/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location)
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/lye
|
||||
name = "lye"
|
||||
id = "lye"
|
||||
result = "lye"
|
||||
required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1)
|
||||
result_amount = 3
|
||||
|
||||
///Alchemical Reagents
|
||||
|
||||
datum/reagent/eyenewt
|
||||
|
||||
@@ -87,5 +87,5 @@
|
||||
name = "Sterilizine"
|
||||
id = "sterilizine"
|
||||
result = "sterilizine"
|
||||
required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
|
||||
required_reagents = list("antihol" = 2, "chlorine" = 1)
|
||||
result_amount = 3
|
||||
@@ -326,6 +326,30 @@
|
||||
qdel(R)
|
||||
T.Bless()
|
||||
|
||||
|
||||
/datum/reagent/liquidgibs
|
||||
name = "Liquid gibs"
|
||||
id = "liquidgibs"
|
||||
color = "#FF9966"
|
||||
description = "You don't even want to think about what's in here."
|
||||
reagent_state = LIQUID
|
||||
|
||||
/datum/reagent/liquidgibs/reaction_turf(var/turf/T, var/volume) //yes i took it from synthflesh...
|
||||
src = null
|
||||
if(volume >= 5)
|
||||
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
|
||||
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
|
||||
return
|
||||
|
||||
|
||||
|
||||
/datum/reagent/lye
|
||||
name = "Lye"
|
||||
id = "lye"
|
||||
description = "Also known as sodium hydroxide."
|
||||
reagent_state = LIQUID
|
||||
color = "#FFFFD6" // very very light yellow
|
||||
|
||||
/*
|
||||
/datum/reagent/vaccine
|
||||
//data must contain virus type
|
||||
|
||||
@@ -3316,3 +3316,29 @@
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("ectoplasm", 10)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood
|
||||
name = "\improper LiquidFood Ration"
|
||||
desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy?"
|
||||
icon_state = "liquidfood"
|
||||
trash = /obj/item/trash/liquidfood
|
||||
filling_color = "#A8A8A8"
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("nutriment", 20)
|
||||
reagents.add_reagent("iron", 3)
|
||||
bitesize = 4
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tastybread
|
||||
name = "bread tube"
|
||||
desc = "Bread in a tube. Chewy...and surprisingly tasty."
|
||||
icon_state = "tastybread"
|
||||
trash = /obj/item/trash/tastybread
|
||||
filling_color = "#A66829"
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("nutriment", 6)
|
||||
bitesize = 2
|
||||
@@ -33,6 +33,9 @@
|
||||
var/subjectname = ""
|
||||
var/subjectjob = null
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct
|
||||
name = "meat product"
|
||||
desc = "A slab of station reclaimed and chemically processed meat product."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey
|
||||
//same as plain meat
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
id = "scalpel_laser1"
|
||||
req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 12500, MAT_GLASS = 7500)
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500)
|
||||
build_path = /obj/item/weapon/scalpel/laser1
|
||||
category = list("Medical")
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
id = "scalpel_laser2"
|
||||
req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 2500)
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000)
|
||||
build_path = /obj/item/weapon/scalpel/laser2
|
||||
category = list("Medical")
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
id = "scalpel_laser3"
|
||||
req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 2000, MAT_GOLD = 1500)
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000)
|
||||
build_path = /obj/item/weapon/scalpel/laser3
|
||||
category = list("Medical")
|
||||
|
||||
@@ -204,7 +204,7 @@
|
||||
id = "scalpel_manager"
|
||||
req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list (MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 1500, MAT_GOLD = 1500, MAT_DIAMOND = 750)
|
||||
materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000)
|
||||
build_path = /obj/item/weapon/scalpel/manager
|
||||
category = list("Medical")
|
||||
|
||||
|
||||
@@ -953,3 +953,41 @@ var/list/compatible_mobs = list(/mob/living/carbon/human)
|
||||
stage = 1
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob << "<span class = 'notice'> You feel optimistic!</span>"
|
||||
|
||||
/datum/disease2/effect/anxiety
|
||||
name = "Severe Anxiety"
|
||||
stage = 2
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
if(prob(20))
|
||||
mob << "<span class='notice'>You feel anxious.</span>"
|
||||
if(prob(15))
|
||||
mob << "<span class='danger'>You feel butterflies in your stomach.</span>"
|
||||
if(prob(11))
|
||||
mob.visible_message("<span class='danger'>[mob] stumbles around in a panic.</span>", \
|
||||
"<span class='userdanger'>You have a panic attack!</span>")
|
||||
mob.confused += (rand(6,8))
|
||||
mob.jitteriness += (rand(6,8))
|
||||
if(prob(10))
|
||||
mob.visible_message("<span class='danger'>[mob] coughs up butterflies!</span>", \
|
||||
"<span class='userdanger'>You cough up butterflies!</span>")
|
||||
new /mob/living/simple_animal/butterfly(mob.loc)
|
||||
new /mob/living/simple_animal/butterfly(mob.loc)
|
||||
|
||||
/datum/disease2/effect/lycan
|
||||
name = "Lycancoughy"
|
||||
stage = 3
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
if(prob(20))
|
||||
mob << "<span class='notice'>You feel itchy.</span>"
|
||||
if(prob(15))
|
||||
mob << "<span class='danger'>You have the sudden urge for bacon..</span>"
|
||||
if(prob(11))
|
||||
mob.say(pick("WOOF!", "BARK!", "Bark.", "Woof?", "AUUUUUUUUUUUUU!!"))
|
||||
if(prob(10))
|
||||
mob.visible_message("<span class='danger'>[mob] coughs up a dog!!</span>", \
|
||||
"<span class='userdanger'>You cough up a DOG!!!</span>")
|
||||
//yes i KNOW foxes technically are not normal dogs...hush....
|
||||
var/randompup = pick(/mob/living/simple_animal/pet/corgi/puppy,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/pet/fox)
|
||||
|
||||
new randompup(mob.loc)
|
||||
mob.adjustBruteLoss(rand(1,5))//you just coughed up a CANINIE, you are taking brute loss...
|
||||
Reference in New Issue
Block a user