Merge branch 'master' into upstream-merge-33316
This commit is contained in:
@@ -437,7 +437,7 @@
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage")
|
||||
for(var/mob/living/carbon/human/H in GLOB.player_list)
|
||||
to_chat(H, "<span class='boldannounce'>You suddenly feel stupid.</span>")
|
||||
H.setBrainLoss(60)
|
||||
H.adjustBrainLoss(60, 80)
|
||||
message_admins("[key_name_admin(usr)] made everybody retarded")
|
||||
|
||||
if("eagles")//SCRAW
|
||||
|
||||
@@ -393,6 +393,8 @@
|
||||
log_admin("[key_name(usr)] [msg]")
|
||||
message_admins("[key_name_admin(usr)] [msg]")
|
||||
href_list["secrets"] = "check_antagonist"
|
||||
if(SSticker.ready_for_reboot && !SSticker.delay_end) //we undelayed after standard reboot would occur
|
||||
SSticker.standard_reboot()
|
||||
|
||||
else if(href_list["end_round"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
/proc/machine_upgrade(obj/machinery/M in world)
|
||||
set name = "Tweak Component Ratings"
|
||||
set category = "Debug"
|
||||
if (!istype(M))
|
||||
return
|
||||
|
||||
var/new_rating = input("Enter new rating:","Num") as num
|
||||
if(new_rating && M.component_parts)
|
||||
for(var/obj/item/stock_parts/P in M.component_parts)
|
||||
|
||||
@@ -651,10 +651,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set name = "Change View Range"
|
||||
set desc = "switches between 1x and custom views"
|
||||
|
||||
if(view == world.view)
|
||||
if(view == CONFIG_GET(string/default_view))
|
||||
change_view(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128))
|
||||
else
|
||||
change_view(world.view)
|
||||
change_view(CONFIG_GET(string/default_view))
|
||||
|
||||
log_admin("[key_name(usr)] changed their view range to [view].")
|
||||
//message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI
|
||||
@@ -1221,7 +1221,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
target.electrocution_animation(40)
|
||||
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
||||
if(ADMIN_PUNISHMENT_BRAINDAMAGE)
|
||||
target.adjustBrainLoss(75)
|
||||
target.adjustBrainLoss(199, 199)
|
||||
if(ADMIN_PUNISHMENT_GIB)
|
||||
target.gib(FALSE)
|
||||
if(ADMIN_PUNISHMENT_BSA)
|
||||
|
||||
+142
-143
@@ -1,143 +1,142 @@
|
||||
/obj/item/device/assembly/mousetrap
|
||||
name = "mousetrap"
|
||||
desc = "A handy little spring-loaded trap for catching pesty rodents."
|
||||
icon_state = "mousetrap"
|
||||
materials = list(MAT_METAL=100)
|
||||
origin_tech = "combat=1;materials=2;engineering=1"
|
||||
attachable = 1
|
||||
var/armed = 0
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/examine(mob/user)
|
||||
..()
|
||||
if(armed)
|
||||
to_chat(user, "The mousetrap is armed!")
|
||||
else
|
||||
to_chat(user, "The mousetrap is not armed.")
|
||||
|
||||
/obj/item/device/assembly/mousetrap/activate()
|
||||
if(..())
|
||||
armed = !armed
|
||||
if(!armed)
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY && prob(50))
|
||||
to_chat(user, "<span class='warning'>Your hand slips, setting off the trigger!</span>")
|
||||
pulse(0)
|
||||
update_icon()
|
||||
if(usr)
|
||||
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
/obj/item/device/assembly/mousetrap/describe()
|
||||
return "The pressure switch is [armed?"primed":"safe"]."
|
||||
|
||||
/obj/item/device/assembly/mousetrap/update_icon()
|
||||
if(armed)
|
||||
icon_state = "mousetraparmed"
|
||||
else
|
||||
icon_state = "mousetrap"
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
|
||||
if(!armed)
|
||||
return
|
||||
var/obj/item/bodypart/affecting = null
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(PIERCEIMMUNE in H.dna.species.species_traits)
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
armed = 0
|
||||
update_icon()
|
||||
pulse(0)
|
||||
return 0
|
||||
switch(type)
|
||||
if("feet")
|
||||
if(!H.shoes)
|
||||
affecting = H.get_bodypart(pick("l_leg", "r_leg"))
|
||||
H.Knockdown(60)
|
||||
if("l_hand", "r_hand")
|
||||
if(!H.gloves)
|
||||
affecting = H.get_bodypart(type)
|
||||
H.Stun(60)
|
||||
if(affecting)
|
||||
if(affecting.receive_damage(1, 0))
|
||||
H.update_damage_overlays()
|
||||
else if(ismouse(target))
|
||||
var/mob/living/simple_animal/mouse/M = target
|
||||
visible_message("<span class='boldannounce'>SPLAT!</span>")
|
||||
M.splat()
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
armed = 0
|
||||
update_icon()
|
||||
pulse(0)
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user)
|
||||
if(!armed)
|
||||
to_chat(user, "<span class='notice'>You arm [src].</span>")
|
||||
else
|
||||
if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!(user.active_hand_index % 2))
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You disarm [src].</span>")
|
||||
armed = !armed
|
||||
update_icon()
|
||||
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
|
||||
if(armed)
|
||||
if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!(user.active_hand_index % 2))
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(ismob(AM))
|
||||
var/mob/MM = AM
|
||||
if(!(MM.movement_type & FLYING))
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
if(H.m_intent == MOVE_INTENT_RUN)
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
else if(ismouse(MM))
|
||||
triggered(MM)
|
||||
else if(AM.density) // For mousetrap grenades, set off by anything heavy
|
||||
triggered(AM)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/on_found(mob/finder)
|
||||
if(armed)
|
||||
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand")
|
||||
return 1 //end the search!
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/hitby(A as mob|obj)
|
||||
if(!armed)
|
||||
return ..()
|
||||
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
|
||||
triggered(null)
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/armed
|
||||
icon_state = "mousetraparmed"
|
||||
armed = 1
|
||||
/obj/item/device/assembly/mousetrap
|
||||
name = "mousetrap"
|
||||
desc = "A handy little spring-loaded trap for catching pesty rodents."
|
||||
icon_state = "mousetrap"
|
||||
materials = list(MAT_METAL=100)
|
||||
attachable = 1
|
||||
var/armed = 0
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/examine(mob/user)
|
||||
..()
|
||||
if(armed)
|
||||
to_chat(user, "The mousetrap is armed!")
|
||||
else
|
||||
to_chat(user, "The mousetrap is not armed.")
|
||||
|
||||
/obj/item/device/assembly/mousetrap/activate()
|
||||
if(..())
|
||||
armed = !armed
|
||||
if(!armed)
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||
to_chat(user, "<span class='warning'>Your hand slips, setting off the trigger!</span>")
|
||||
pulse(0)
|
||||
update_icon()
|
||||
if(usr)
|
||||
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
/obj/item/device/assembly/mousetrap/describe()
|
||||
return "The pressure switch is [armed?"primed":"safe"]."
|
||||
|
||||
/obj/item/device/assembly/mousetrap/update_icon()
|
||||
if(armed)
|
||||
icon_state = "mousetraparmed"
|
||||
else
|
||||
icon_state = "mousetrap"
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
|
||||
if(!armed)
|
||||
return
|
||||
var/obj/item/bodypart/affecting = null
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(PIERCEIMMUNE in H.dna.species.species_traits)
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
armed = 0
|
||||
update_icon()
|
||||
pulse(0)
|
||||
return 0
|
||||
switch(type)
|
||||
if("feet")
|
||||
if(!H.shoes)
|
||||
affecting = H.get_bodypart(pick("l_leg", "r_leg"))
|
||||
H.Knockdown(60)
|
||||
if("l_hand", "r_hand")
|
||||
if(!H.gloves)
|
||||
affecting = H.get_bodypart(type)
|
||||
H.Stun(60)
|
||||
if(affecting)
|
||||
if(affecting.receive_damage(1, 0))
|
||||
H.update_damage_overlays()
|
||||
else if(ismouse(target))
|
||||
var/mob/living/simple_animal/mouse/M = target
|
||||
visible_message("<span class='boldannounce'>SPLAT!</span>")
|
||||
M.splat()
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
armed = 0
|
||||
update_icon()
|
||||
pulse(0)
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user)
|
||||
if(!armed)
|
||||
to_chat(user, "<span class='notice'>You arm [src].</span>")
|
||||
else
|
||||
if((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!(user.active_hand_index % 2))
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You disarm [src].</span>")
|
||||
armed = !armed
|
||||
update_icon()
|
||||
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
|
||||
if(armed)
|
||||
if((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!(user.active_hand_index % 2))
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(ismob(AM))
|
||||
var/mob/MM = AM
|
||||
if(!(MM.movement_type & FLYING))
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
if(H.m_intent == MOVE_INTENT_RUN)
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
else if(ismouse(MM))
|
||||
triggered(MM)
|
||||
else if(AM.density) // For mousetrap grenades, set off by anything heavy
|
||||
triggered(AM)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/on_found(mob/finder)
|
||||
if(armed)
|
||||
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand")
|
||||
return 1 //end the search!
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/hitby(A as mob|obj)
|
||||
if(!armed)
|
||||
return ..()
|
||||
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
|
||||
triggered(null)
|
||||
|
||||
|
||||
/obj/item/device/assembly/mousetrap/armed
|
||||
icon_state = "mousetraparmed"
|
||||
armed = 1
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
//list of open turfs adjacent to us
|
||||
var/list/atmos_adjacent_turfs
|
||||
//bitfield of dirs in which we are superconducitng
|
||||
var/atmos_supeconductivity = 0
|
||||
var/atmos_supeconductivity = NONE
|
||||
|
||||
//used to determine whether we should archive
|
||||
var/archived_cycle = 0
|
||||
@@ -25,8 +25,7 @@
|
||||
var/pressure_direction = 0
|
||||
|
||||
var/datum/excited_group/excited_group
|
||||
var/excited = 0
|
||||
var/recently_active = 0
|
||||
var/excited = FALSE
|
||||
var/datum/gas_mixture/turf/air
|
||||
|
||||
var/obj/effect/hotspot/active_hotspot
|
||||
@@ -54,10 +53,10 @@
|
||||
|
||||
/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
|
||||
if(!giver)
|
||||
return 0
|
||||
return FALSE
|
||||
air.merge(giver)
|
||||
update_visuals()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/turf/open/remove_air(amount)
|
||||
var/datum/gas_mixture/ours = return_air()
|
||||
@@ -83,7 +82,7 @@
|
||||
|
||||
/turf/temperature_expose()
|
||||
if(temperature > heat_capacity)
|
||||
to_be_destroyed = 1
|
||||
to_be_destroyed = TRUE
|
||||
|
||||
/turf/proc/archive()
|
||||
temperature_archived = temperature
|
||||
@@ -102,7 +101,7 @@
|
||||
#if DM_VERSION >= 513
|
||||
#warning 512 is stable now for sure, remove the old code
|
||||
#endif
|
||||
|
||||
|
||||
#if DM_VERSION >= 512
|
||||
if (atmos_overlay_types)
|
||||
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
|
||||
@@ -175,64 +174,48 @@
|
||||
for(var/t in adjacent_turfs)
|
||||
var/turf/open/enemy_tile = t
|
||||
|
||||
if(fire_count > enemy_tile.current_cycle)
|
||||
enemy_tile.archive()
|
||||
if(fire_count <= enemy_tile.current_cycle)
|
||||
continue
|
||||
enemy_tile.archive()
|
||||
|
||||
/******************* GROUP HANDLING START *****************************************************************/
|
||||
/******************* GROUP HANDLING START *****************************************************************/
|
||||
|
||||
var/should_share_air = FALSE
|
||||
var/datum/gas_mixture/enemy_air = enemy_tile.air
|
||||
if(enemy_tile.excited)
|
||||
//cache for sanic speed
|
||||
var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
|
||||
if(our_excited_group)
|
||||
if(enemy_excited_group)
|
||||
if(our_excited_group != enemy_excited_group)
|
||||
//combine groups (this also handles updating the excited_group var of all involved turfs)
|
||||
our_excited_group.merge_groups(enemy_excited_group)
|
||||
our_excited_group = excited_group //update our cache
|
||||
should_share_air = TRUE
|
||||
else
|
||||
if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
|
||||
our_excited_group.add_turf(enemy_tile) //add enemy to our group
|
||||
should_share_air = TRUE
|
||||
var/should_share_air = FALSE
|
||||
var/datum/gas_mixture/enemy_air = enemy_tile.air
|
||||
|
||||
//cache for sanic speed
|
||||
var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
|
||||
|
||||
if(our_excited_group && enemy_excited_group)
|
||||
if(our_excited_group != enemy_excited_group)
|
||||
//combine groups (this also handles updating the excited_group var of all involved turfs)
|
||||
our_excited_group.merge_groups(enemy_excited_group)
|
||||
our_excited_group = excited_group //update our cache
|
||||
should_share_air = TRUE
|
||||
|
||||
else if(our_air.compare(enemy_air))
|
||||
if(!enemy_tile.excited)
|
||||
SSair.add_to_active(enemy_tile)
|
||||
var/datum/excited_group/EG = our_excited_group || enemy_excited_group || new
|
||||
if(!our_excited_group)
|
||||
EG.add_turf(src)
|
||||
if(!enemy_excited_group)
|
||||
EG.add_turf(enemy_tile)
|
||||
our_excited_group = excited_group
|
||||
should_share_air = TRUE
|
||||
|
||||
//air sharing
|
||||
if(should_share_air)
|
||||
var/difference = our_air.share(enemy_air, adjacent_turfs_length)
|
||||
if(difference)
|
||||
if(difference > 0)
|
||||
consider_pressure_difference(enemy_tile, difference)
|
||||
else
|
||||
if(enemy_excited_group)
|
||||
if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
|
||||
enemy_excited_group.add_turf(src) //join self to enemy group
|
||||
our_excited_group = excited_group //update our cache
|
||||
should_share_air = TRUE
|
||||
else
|
||||
if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
|
||||
var/datum/excited_group/EG = new //generate new group
|
||||
EG.add_turf(src)
|
||||
EG.add_turf(enemy_tile)
|
||||
our_excited_group = excited_group //update our cache
|
||||
should_share_air = TRUE
|
||||
else
|
||||
if(our_air.compare(enemy_air)) //compare if
|
||||
SSair.add_to_active(enemy_tile) //excite enemy
|
||||
if(our_excited_group)
|
||||
our_excited_group.add_turf(enemy_tile) //add enemy to group
|
||||
else
|
||||
var/datum/excited_group/EG = new //generate new group
|
||||
EG.add_turf(src)
|
||||
EG.add_turf(enemy_tile)
|
||||
our_excited_group = excited_group //update our cache
|
||||
should_share_air = TRUE
|
||||
|
||||
//air sharing
|
||||
if(should_share_air)
|
||||
var/difference = our_air.share(enemy_air, adjacent_turfs_length)
|
||||
if(difference)
|
||||
if(difference > 0)
|
||||
consider_pressure_difference(enemy_tile, difference)
|
||||
else
|
||||
enemy_tile.consider_pressure_difference(src, -difference)
|
||||
LAST_SHARE_CHECK
|
||||
enemy_tile.consider_pressure_difference(src, -difference)
|
||||
LAST_SHARE_CHECK
|
||||
|
||||
|
||||
/******************* GROUP HANDLING FINISH *********************************************************************/
|
||||
/******************* GROUP HANDLING FINISH *********************************************************************/
|
||||
|
||||
if (planet_atmos) //share our air with the "atmosphere" "above" the turf
|
||||
var/datum/gas_mixture/G = new
|
||||
@@ -250,12 +233,8 @@
|
||||
|
||||
update_visuals()
|
||||
|
||||
var/remove = TRUE
|
||||
if(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION)
|
||||
if(consider_superconductivity(starting = 1))
|
||||
remove = FALSE
|
||||
|
||||
if ((!our_excited_group && remove) || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
|
||||
if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \
|
||||
|| (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
|
||||
SSair.remove_from_active(src)
|
||||
|
||||
atmos_cooldown = cached_atmos_cooldown
|
||||
@@ -279,9 +258,9 @@
|
||||
var/const/PROBABILITY_OFFSET = 25
|
||||
var/const/PROBABILITY_BASE_PRECENT = 75
|
||||
set waitfor = 0
|
||||
. = 0
|
||||
. = FALSE
|
||||
if (!anchored && !pulledby)
|
||||
. = 1
|
||||
. = TRUE
|
||||
if (last_high_pressure_movement_air_cycle < SSair.times_fired)
|
||||
var/move_prob = 100
|
||||
if (pressure_resistance > 0)
|
||||
@@ -304,7 +283,6 @@
|
||||
/datum/excited_group/proc/add_turf(turf/open/T)
|
||||
turf_list += T
|
||||
T.excited_group = src
|
||||
T.recently_active = 1
|
||||
reset_cooldowns()
|
||||
|
||||
/datum/excited_group/proc/merge_groups(datum/excited_group/E)
|
||||
@@ -328,25 +306,27 @@
|
||||
dismantle_cooldown = 0
|
||||
|
||||
//argument is so world start can clear out any turf differences quickly.
|
||||
/datum/excited_group/proc/self_breakdown(space_is_all_consuming = 0)
|
||||
/datum/excited_group/proc/self_breakdown(space_is_all_consuming = FALSE)
|
||||
var/datum/gas_mixture/A = new
|
||||
|
||||
//make local for sanic speed
|
||||
var/list/A_gases = A.gases
|
||||
var/list/turf_list = src.turf_list
|
||||
var/turflen = turf_list.len
|
||||
var/space_in_group = 0
|
||||
var/space_in_group = FALSE
|
||||
|
||||
for(var/t in turf_list)
|
||||
var/turf/open/T = t
|
||||
if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
|
||||
space_in_group = 1
|
||||
space_in_group = TRUE
|
||||
qdel(A)
|
||||
A = new/datum/gas_mixture/immutable/space()
|
||||
A = new /datum/gas_mixture/immutable/space()
|
||||
A_gases = A.gases //update the cache
|
||||
break
|
||||
A.merge(T.air)
|
||||
|
||||
for(var/id in A_gases)
|
||||
A_gases[id][MOLES] = A_gases[id][MOLES]/turflen
|
||||
A_gases[id][MOLES] /= turflen
|
||||
|
||||
for(var/t in turf_list)
|
||||
var/turf/open/T = t
|
||||
@@ -359,8 +339,7 @@
|
||||
/datum/excited_group/proc/dismantle()
|
||||
for(var/t in turf_list)
|
||||
var/turf/open/T = t
|
||||
T.excited = 0
|
||||
T.recently_active = 0
|
||||
T.excited = FALSE
|
||||
T.excited_group = null
|
||||
SSair.active_turfs -= T
|
||||
garbage_collect()
|
||||
@@ -432,7 +411,7 @@
|
||||
//Make sure still hot enough to continue conducting heat
|
||||
if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)
|
||||
SSair.active_super_conductivity -= src
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/turf/open/finish_superconduction()
|
||||
//Conduct with air on my tile if I have it
|
||||
@@ -442,21 +421,21 @@
|
||||
|
||||
/turf/proc/consider_superconductivity()
|
||||
if(!thermal_conductivity)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
SSair.active_super_conductivity |= src
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/turf/open/consider_superconductivity(starting)
|
||||
if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
|
||||
return 0
|
||||
return FALSE
|
||||
if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant.
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/turf/closed/consider_superconductivity(starting)
|
||||
if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/turf/proc/radiate_to_spess() //Radiate excess tile heat to space
|
||||
@@ -465,7 +444,7 @@
|
||||
if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER))
|
||||
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here
|
||||
(heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM))
|
||||
temperature -= heat/heat_capacity
|
||||
|
||||
/turf/open/proc/temperature_share_open_to_solid(turf/sharer)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
#define NO_REACTION 0
|
||||
#define REACTING 1
|
||||
//Plasma fire properties
|
||||
#define OXYGEN_BURN_RATE_BASE 1.4
|
||||
#define PLASMA_BURN_RATE_DELTA 9
|
||||
@@ -359,9 +357,6 @@
|
||||
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
|
||||
air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB)
|
||||
|
||||
|
||||
#undef REACTING
|
||||
#undef NO_REACTION
|
||||
#undef OXYGEN_BURN_RATE_BASE
|
||||
#undef PLASMA_BURN_RATE_DELTA
|
||||
#undef PLASMA_UPPER_TEMPERATURE
|
||||
@@ -386,4 +381,4 @@
|
||||
#undef CATALYST_COEFFICENT
|
||||
#undef FUSION_PURITY_THRESHOLD
|
||||
#undef FUSION_HEAT_DROPOFF
|
||||
#undef NOBLIUM_FORMATION_ENERGY
|
||||
#undef NOBLIUM_FORMATION_ENERGY
|
||||
|
||||
@@ -356,6 +356,9 @@
|
||||
. = TRUE
|
||||
if("threshold")
|
||||
var/env = params["env"]
|
||||
if(text2path(env))
|
||||
env = text2path(env)
|
||||
|
||||
var/name = params["var"]
|
||||
var/datum/tlv/tlv = TLV[env]
|
||||
if(isnull(tlv))
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
var/list/json = json_decode(file2text(json_file))
|
||||
shenanigans = json["phrases"]
|
||||
|
||||
#define TIMEWASTE_MEDAL "Overextended The Joke"
|
||||
|
||||
/obj/structure/speaking_tile/interact(mob/user)
|
||||
if(!isliving(user) || speaking)
|
||||
return
|
||||
@@ -45,11 +47,11 @@
|
||||
SpeakPeace(list("Alright maybe that's <b>too</b> boring.", "I can't keep manually typing these lines out though.", "It's hard to explain but the code structure I'm using is kind of terrible."))
|
||||
if(10)
|
||||
SpeakPeace(list("Oh I have an idea!", "Lets outsource this endless banter to Poly!", "Then you'll be able to keep listening to this without getting bored!"))
|
||||
if(isnull(shenanigans))
|
||||
if(isnull(shenanigans) || !shenanigans.len)
|
||||
shenanigans = list("Except the poly file is missing...")
|
||||
if(11 to 14, 16 to 50, 52 to 99, 103 to 107, 109 to 203, 205 to 249, 252 to 665, 667 to 999, 1001 to 5642)
|
||||
SpeakPeace(list(pick(shenanigans),pick(shenanigans),pick(shenanigans)))
|
||||
if(times_spoken_to * 0.1 == round(times_spoken_to * 0.1))
|
||||
if(times_spoken_to % 10 == 0)
|
||||
SpeakPeace(list("That's [times_spoken_to] times you've spoken to me by the way."))
|
||||
if(15)
|
||||
SpeakPeace(list("See? Isn't this fun?","Now you can mash this for hours without getting bored.","Anyway I'll leave you it."))
|
||||
@@ -79,6 +81,7 @@
|
||||
if(1000)
|
||||
SpeakPeace(list("The ends exists somewhere beyond meaningful milestones.", "There will be no more messages until then.", "You disgust me."))
|
||||
if(5643)
|
||||
UnlockMedal(TIMEWASTE_MEDAL,user.client)
|
||||
var/obj/item/reagent_containers/food/drinks/trophy/gold_cup/never_ends = new(get_turf(user))
|
||||
never_ends.name = "Overextending The Joke: First Place"
|
||||
never_ends.desc = "And so we are left alone with our regrets."
|
||||
@@ -87,7 +90,7 @@
|
||||
|
||||
speaking = FALSE
|
||||
times_spoken_to++
|
||||
|
||||
#undef TIMEWASTE_MEDAL
|
||||
/obj/structure/speaking_tile/proc/SpeakPeace(list/statements)
|
||||
for(var/i in 1 to statements.len)
|
||||
say("<span class='deadsay'>[statements[i]]</span>")
|
||||
|
||||
@@ -442,7 +442,7 @@ GLOBAL_LIST(external_rsc_urls)
|
||||
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
|
||||
to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.")
|
||||
var/list/connectiontopic_a = params2list(connectiontopic)
|
||||
var/list/panic_addr = CONFIG_GET(string/panic_address)
|
||||
var/list/panic_addr = CONFIG_GET(string/panic_server_address)
|
||||
if(panic_addr && !connectiontopic_a["redirect"])
|
||||
var/panic_name = CONFIG_GET(string/panic_server_name)
|
||||
to_chat(src, "<span class='notice'>Sending you to [panic_name ? panic_name : panic_addr].</span>")
|
||||
|
||||
@@ -178,6 +178,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/list/exp
|
||||
var/list/menuoptions
|
||||
|
||||
var/action_buttons_screen_locs = list()
|
||||
|
||||
//citadel code
|
||||
var/arousable = TRUE //Allows players to disable arousal from the character creation menu
|
||||
|
||||
|
||||
@@ -119,11 +119,9 @@
|
||||
death(0)
|
||||
|
||||
/mob/living/silicon/pai/verb/suicide()
|
||||
set category = "pAI Commands"
|
||||
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
|
||||
set name = "pAI Suicide"
|
||||
var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
|
||||
if(answer == "Yes")
|
||||
set hidden = 1
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
var/turf/T = get_turf(src.loc)
|
||||
T.visible_message("<span class='notice'>[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"</span>", null, \
|
||||
"<span class='notice'>[src] bleeps electronically.</span>")
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
/obj/item/clothing/glasses/meson/engine
|
||||
name = "engineering scanner goggles"
|
||||
desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation."
|
||||
icon_state = "trayson"
|
||||
icon_state = "trayson-meson"
|
||||
item_state = "trayson-meson"
|
||||
actions_types = list(/datum/action/item_action/toggle_mode)
|
||||
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
|
||||
|
||||
@@ -117,14 +118,22 @@
|
||||
flick_overlay(pic, list(user.client), 8)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/update_icon()
|
||||
icon_state = "[initial(icon_state)]-[mode]"
|
||||
if(istype(loc, /mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/user = loc
|
||||
if(user.glasses == src)
|
||||
icon_state = "trayson-[mode]"
|
||||
update_mob()
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/proc/update_mob()
|
||||
item_state = icon_state
|
||||
if(isliving(loc))
|
||||
var/mob/living/user = loc
|
||||
if(user.get_item_by_slot(slot_glasses) == src)
|
||||
user.update_inv_glasses()
|
||||
else
|
||||
user.update_inv_hands()
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/tray //atmos techs have lived far too long without tray goggles while those damned engineers get their dual-purpose gogles all to themselves
|
||||
name = "optical t-ray scanner"
|
||||
icon_state = "trayson-t-ray"
|
||||
item_state = "trayson-t-ray"
|
||||
desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
|
||||
origin_tech = "materials=3;magnets=2;engineering=2"
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
/obj/item/clothing/gloves/color/random
|
||||
name = "random gloves"
|
||||
desc = "These gloves are supposed to be a random color..."
|
||||
icon_state = "white"
|
||||
icon_state = "random_gloves"
|
||||
item_state = "wgloves"
|
||||
item_color = "mime"
|
||||
|
||||
|
||||
@@ -856,21 +856,22 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/unlock_suit(mob/wearer)
|
||||
if(suittoggled)
|
||||
usermessage("You must retract the helmet before unlocking your suit!", "boldwarning")
|
||||
return FALSE
|
||||
if(pack && pack.flight)
|
||||
usermessage("You must shut off the flight-pack before unlocking your suit!", "boldwarning")
|
||||
return FALSE
|
||||
if(deployedpack)
|
||||
usermessage("Your flightpack must be fully retracted first!", "boldwarning")
|
||||
return FALSE
|
||||
if(deployedshoes)
|
||||
usermessage("Your flight shoes must be fully retracted first!", "boldwarning")
|
||||
return FALSE
|
||||
if(wearer)
|
||||
user.visible_message("<span class='notice'>[wearer]'s flight suit detaches from their body, becoming nothing more then a bulky metal skeleton.</span>")
|
||||
playsound(src.loc, 'sound/items/rped.ogg', 65, 1)
|
||||
if(user)
|
||||
if(suittoggled)
|
||||
usermessage("You must retract the helmet before unlocking your suit!", "boldwarning")
|
||||
return FALSE
|
||||
if(pack && pack.flight)
|
||||
usermessage("You must shut off the flight-pack before unlocking your suit!", "boldwarning")
|
||||
return FALSE
|
||||
if(deployedpack)
|
||||
usermessage("Your flightpack must be fully retracted first!", "boldwarning")
|
||||
return FALSE
|
||||
if(deployedshoes)
|
||||
usermessage("Your flight shoes must be fully retracted first!", "boldwarning")
|
||||
return FALSE
|
||||
if(wearer)
|
||||
user.visible_message("<span class='notice'>[wearer]'s flight suit detaches from their body, becoming nothing more then a bulky metal skeleton.</span>")
|
||||
playsound(src, 'sound/items/rped.ogg', 65, 1)
|
||||
resync()
|
||||
strip_delay = initial(strip_delay)
|
||||
locked = FALSE
|
||||
@@ -911,7 +912,7 @@
|
||||
user.update_inv_wear_suit()
|
||||
user.visible_message("<span class='notice'>[user]'s [pack.name] detaches from their back and retracts into their [src]!</span>")
|
||||
pack.forceMove(src)
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
deployedpack = FALSE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/extend_flightshoes(forced = FALSE)
|
||||
@@ -936,7 +937,7 @@
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightshoes(forced = FALSE)
|
||||
shoes.flags_1 &= ~NODROP_1
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
if(user)
|
||||
user.transferItemToLoc(shoes, src, TRUE)
|
||||
user.update_inv_wear_suit()
|
||||
@@ -1092,15 +1093,16 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/dropped(mob/living/carbon/human/wearer)
|
||||
..()
|
||||
for(var/hudtype in datahuds)
|
||||
var/datum/atom_hud/H = GLOB.huds[hudtype]
|
||||
H.remove_hud_from(wearer)
|
||||
if(zoom)
|
||||
toggle_zoom(wearer, TRUE)
|
||||
if(wearer)
|
||||
for(var/hudtype in datahuds)
|
||||
var/datum/atom_hud/H = GLOB.huds[hudtype]
|
||||
H.remove_hud_from(wearer)
|
||||
if(zoom)
|
||||
toggle_zoom(wearer, TRUE)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/proc/toggle_zoom(mob/living/user, force_off = FALSE)
|
||||
if(zoom || force_off)
|
||||
user.client.change_view(world.view)
|
||||
user.client.change_view(CONFIG_GET(string/default_view))
|
||||
to_chat(user, "<span class='boldnotice'>Disabling smart zooming image enhancement...</span>")
|
||||
zoom = FALSE
|
||||
return FALSE
|
||||
|
||||
@@ -6,11 +6,9 @@
|
||||
alertadmins = 0
|
||||
|
||||
/datum/round_event/camera_failure
|
||||
startWhen = 1
|
||||
endWhen = 2
|
||||
fakeable = FALSE
|
||||
|
||||
/datum/round_event/camera_failure/tick()
|
||||
/datum/round_event/camera_failure/start()
|
||||
var/iterations = 1
|
||||
var/obj/machinery/camera/C = pick(GLOB.cameranet.cameras)
|
||||
while(prob(round(100/iterations)))
|
||||
|
||||
@@ -204,6 +204,7 @@
|
||||
shuttlePortName = "custom location"
|
||||
x_offset = 9
|
||||
y_offset = 0
|
||||
see_hidden = FALSE
|
||||
|
||||
/obj/docking_port/mobile/pirate
|
||||
name = "pirate shuttle"
|
||||
|
||||
@@ -11,29 +11,29 @@
|
||||
|
||||
/datum/round_event/wizard/cursed_items/start()
|
||||
var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "catgirls2015")
|
||||
var/list/wearslots = list(slot_wear_suit, slot_shoes, slot_head, slot_wear_mask, slot_gloves, slot_ears)
|
||||
var/list/loadout = list()
|
||||
var/list/loadout[slots_amt]
|
||||
var/ruins_spaceworthiness
|
||||
var/ruins_wizard_loadout
|
||||
loadout.len = 7
|
||||
|
||||
switch(item_set)
|
||||
if("wizardmimic")
|
||||
loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/head/wizard)
|
||||
loadout[slot_wear_suit] = /obj/item/clothing/suit/wizrobe
|
||||
loadout[slot_shoes] = /obj/item/clothing/shoes/sandal/magic
|
||||
loadout[slot_head] = /obj/item/clothing/head/wizard
|
||||
ruins_spaceworthiness = 1
|
||||
if("swords")
|
||||
loadout[5] = /obj/item/katana/cursed
|
||||
loadout[slot_hands] = /obj/item/katana/cursed
|
||||
if("bigfatdoobie")
|
||||
loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy
|
||||
loadout[slot_wear_mask] = /obj/item/clothing/mask/cigarette/rollie/trippy
|
||||
ruins_spaceworthiness = 1
|
||||
if("boxing")
|
||||
loadout[4] = /obj/item/clothing/mask/luchador
|
||||
loadout[6] = /obj/item/clothing/gloves/boxing
|
||||
loadout[slot_wear_mask] = /obj/item/clothing/mask/luchador
|
||||
loadout[slot_gloves] = /obj/item/clothing/gloves/boxing
|
||||
ruins_spaceworthiness = 1
|
||||
if("voicemodulators")
|
||||
loadout[4] = /obj/item/clothing/mask/chameleon
|
||||
loadout[slot_wear_mask] = /obj/item/clothing/mask/chameleon
|
||||
if("catgirls2015")
|
||||
loadout[3] = /obj/item/clothing/head/kitty
|
||||
loadout[slot_head] = /obj/item/clothing/head/kitty
|
||||
ruins_spaceworthiness = 1
|
||||
ruins_wizard_loadout = 1
|
||||
|
||||
@@ -44,14 +44,13 @@
|
||||
continue
|
||||
if(item_set == "catgirls2015") //Wizard code means never having to say you're sorry
|
||||
H.gender = FEMALE
|
||||
var/list/slots = list(H.wear_suit, H.shoes, H.head, H.wear_mask, H.gloves, H.ears) //add new slots as needed to back
|
||||
for(var/i in 1 to loadout.len)
|
||||
if(loadout[i])
|
||||
var/obj/item/J = loadout[i]
|
||||
var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list
|
||||
H.temporarilyRemoveItemFromInventory(slots[i], TRUE)
|
||||
H.equip_to_slot_or_del(I, wearslots[i])
|
||||
I.flags_1 |= NODROP_1
|
||||
H.dropItemToGround(H.get_item_by_slot(i), TRUE)
|
||||
H.equip_to_slot_or_del(I, i)
|
||||
I.flags_1 |= NODROP_1 | DROPDEL_1
|
||||
I.name = "cursed " + I.name
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
|
||||
@@ -6,12 +6,11 @@
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/wizard/imposter/start()
|
||||
|
||||
for(var/datum/mind/M in SSticker.mode.wizards)
|
||||
if(!ishuman(M.current))
|
||||
continue
|
||||
var/mob/living/carbon/human/W = M.current
|
||||
var/list/candidates = get_candidates(ROLE_WIZARD)
|
||||
var/list/candidates = pollGhostCandidates("Would you like to be an imposter wizard?", ROLE_WIZARD)
|
||||
if(!candidates)
|
||||
return //Sad Trombone
|
||||
var/client/C = pick(candidates)
|
||||
@@ -28,10 +27,10 @@
|
||||
var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard)
|
||||
if(!master.wiz_team)
|
||||
master.create_wiz_team()
|
||||
var/datum/antagonist/wizard/apprentice/imposter = new(I.mind)
|
||||
var/datum/antagonist/wizard/apprentice/imposter/imposter = new(I.mind)
|
||||
imposter.master = M
|
||||
imposter.wiz_team = master.wiz_team
|
||||
master.wiz_team += imposter
|
||||
master.wiz_team.add_member(imposter)
|
||||
I.mind.add_antag_datum(imposter)
|
||||
//Remove if possible
|
||||
SSticker.mode.apprentices += I.mind
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list) //yes, even the dead
|
||||
H.set_species(new_species)
|
||||
H.real_name = new_species.random_name(H.gender,1)
|
||||
H.real_name = H.dna.species.random_name(H.gender,1)
|
||||
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
|
||||
to_chat(H, "<span class='notice'>You feel somehow... different?</span>")
|
||||
if(!all_the_same)
|
||||
|
||||
@@ -454,7 +454,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
|
||||
var/list/image/delusions = list()
|
||||
cost = 50
|
||||
|
||||
/datum/hallucination/delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null)
|
||||
/datum/hallucination/delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null, custom_name = null)
|
||||
. = ..()
|
||||
var/image/A = null
|
||||
var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie")
|
||||
@@ -467,23 +467,31 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
|
||||
switch(kind)
|
||||
if("monkey")//Monkey
|
||||
A = image('icons/mob/monkey.dmi',H,"monkey1")
|
||||
A.name = "Monkey ([rand(1,999)])"
|
||||
if("carp")//Carp
|
||||
A = image('icons/mob/animal.dmi',H,"carp")
|
||||
A.name = "Space Carp"
|
||||
if("corgi")//Corgi
|
||||
A = image('icons/mob/pets.dmi',H,"corgi")
|
||||
A.name = "Corgi"
|
||||
if("skeleton")//Skeletons
|
||||
A = image('icons/mob/human.dmi',H,"skeleton")
|
||||
A.name = "Skeleton"
|
||||
if("zombie")//Zombies
|
||||
A = image('icons/mob/human.dmi',H,"zombie")
|
||||
A.name = "Zombie"
|
||||
if("demon")//Demon
|
||||
A = image('icons/mob/mob.dmi',H,"daemon")
|
||||
A.name = "Demon"
|
||||
if("custom")
|
||||
A = image(custom_icon_file, H, custom_icon)
|
||||
A.name = custom_name
|
||||
A.override = 1
|
||||
if(target.client)
|
||||
delusions |= A
|
||||
target.client.images |= A
|
||||
QDEL_IN(src, duration)
|
||||
if(duration)
|
||||
QDEL_IN(src, duration)
|
||||
|
||||
/datum/hallucination/delusion/Destroy()
|
||||
for(var/image/I in delusions)
|
||||
|
||||
@@ -115,6 +115,7 @@
|
||||
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
|
||||
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
|
||||
B.icon = I
|
||||
B.name = "broken [name]"
|
||||
if(prob(33))
|
||||
new/obj/item/shard(drop_location())
|
||||
playsound(src, "shatter", 70, 1)
|
||||
@@ -186,7 +187,7 @@
|
||||
// Formatting is the same as food.
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/coffee
|
||||
name = "Robust Coffee"
|
||||
name = "robust coffee"
|
||||
desc = "Careful, the beverage you're about to enjoy is extremely hot."
|
||||
icon_state = "coffee"
|
||||
list_reagents = list("coffee" = 30)
|
||||
@@ -195,7 +196,7 @@
|
||||
isGlass = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/ice
|
||||
name = "Ice Cup"
|
||||
name = "ice cup"
|
||||
desc = "Careful, cold ice, do not chew."
|
||||
icon_state = "coffee"
|
||||
list_reagents = list("ice" = 30)
|
||||
@@ -216,12 +217,12 @@
|
||||
icon_state = "tea_empty"
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mug/tea
|
||||
name = "Duke Purple Tea"
|
||||
name = "Duke Purple tea"
|
||||
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
|
||||
list_reagents = list("tea" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mug/coco
|
||||
name = "Dutch Hot Coco"
|
||||
name = "Dutch hot coco"
|
||||
desc = "Made in Space South America."
|
||||
list_reagents = list("hot_coco" = 30, "sugar" = 5)
|
||||
foodtype = SUGAR
|
||||
@@ -230,7 +231,7 @@
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/dry_ramen
|
||||
name = "Cup Ramen"
|
||||
name = "cup ramen"
|
||||
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
|
||||
icon_state = "ramen"
|
||||
list_reagents = list("dry_ramen" = 30)
|
||||
@@ -238,7 +239,7 @@
|
||||
isGlass = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/beer
|
||||
name = "Space Beer"
|
||||
name = "space beer"
|
||||
desc = "Beer. In space."
|
||||
icon_state = "beer"
|
||||
list_reagents = list("beer" = 30)
|
||||
@@ -282,7 +283,7 @@
|
||||
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
|
||||
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
|
||||
B.icon = I
|
||||
B.name = "broken carton"
|
||||
B.name = "broken [name]"
|
||||
B.force = 0
|
||||
B.throwforce = 0
|
||||
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
|
||||
@@ -420,28 +421,28 @@
|
||||
foodtype = SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/tonic
|
||||
name = "T-Borg's Tonic Water"
|
||||
name = "T-Borg's tonic water"
|
||||
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
|
||||
icon_state = "tonic"
|
||||
list_reagents = list("tonic" = 50)
|
||||
foodtype = ALCOHOL
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/sodawater
|
||||
name = "Soda Water"
|
||||
name = "soda water"
|
||||
desc = "A can of soda water. Why not make a scotch and soda?"
|
||||
icon_state = "sodawater"
|
||||
list_reagents = list("sodawater" = 50)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime
|
||||
name = "Orange Soda"
|
||||
name = "orange soda"
|
||||
desc = "You wanted ORANGE. It gave you Lemon Lime."
|
||||
icon_state = "lemon-lime"
|
||||
list_reagents = list("lemon_lime" = 30)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/New()
|
||||
..()
|
||||
name = "Lemon-Lime Soda"
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize()
|
||||
. = ..()
|
||||
name = "lemon-lime soda"
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/space_up
|
||||
name = "Space-Up!"
|
||||
@@ -485,14 +486,14 @@
|
||||
list_reagents = list("pwr_game" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers
|
||||
name = "Shambler's Juice"
|
||||
name = "Shambler's juice"
|
||||
desc = "~Shake me up some of that Shambler's Juice!~"
|
||||
icon_state = "shamblers"
|
||||
list_reagents = list("shamblers" = 30)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/air
|
||||
name = "Canned Air"
|
||||
name = "canned air"
|
||||
desc = "There is no air shortage. Do not drink."
|
||||
icon_state = "air"
|
||||
list_reagents = list("nitrogen" = 24, "oxygen" = 6)
|
||||
|
||||
@@ -35,10 +35,10 @@
|
||||
new/obj/item/shard(drop_location())
|
||||
playsound(src, "shatter", 70, 1)
|
||||
else
|
||||
B.name = "broken carton"
|
||||
B.force = 0
|
||||
B.throwforce = 0
|
||||
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
|
||||
B.name = "broken [name]"
|
||||
transfer_fingerprints_to(B)
|
||||
|
||||
qdel(src)
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
//Keeping this here for now, I'll ask if I should keep it here.
|
||||
/obj/item/broken_bottle
|
||||
name = "Broken Bottle"
|
||||
name = "broken bottle"
|
||||
desc = "A bottle with a sharp broken bottom."
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "broken_bottle"
|
||||
@@ -135,37 +135,37 @@
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/gin
|
||||
name = "Griffeater Gin"
|
||||
name = "Griffeater gin"
|
||||
desc = "A bottle of high quality gin, produced in the New London Space Station."
|
||||
icon_state = "ginbottle"
|
||||
list_reagents = list("gin" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/whiskey
|
||||
name = "Uncle Git's Special Reserve"
|
||||
name = "Uncle Git's special reserve"
|
||||
desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
|
||||
icon_state = "whiskeybottle"
|
||||
list_reagents = list("whiskey" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/vodka
|
||||
name = "Tunguska Triple Distilled"
|
||||
name = "Tunguska triple distilled"
|
||||
desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
|
||||
icon_state = "vodkabottle"
|
||||
list_reagents = list("vodka" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka
|
||||
name = "Badminka Vodka"
|
||||
name = "Badminka vodka"
|
||||
desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'."
|
||||
icon_state = "badminka"
|
||||
list_reagents = list("vodka" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/tequila
|
||||
name = "Caccavo Guaranteed Quality Tequila"
|
||||
name = "Caccavo guaranteed quality tequila"
|
||||
desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
|
||||
icon_state = "tequilabottle"
|
||||
list_reagents = list("tequila" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing
|
||||
name = "Bottle of Nothing"
|
||||
name = "bottle of nothing"
|
||||
desc = "A bottle filled with nothing."
|
||||
icon_state = "bottleofnothing"
|
||||
list_reagents = list("nothing" = 100)
|
||||
@@ -178,13 +178,13 @@
|
||||
list_reagents = list("patron" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/rum
|
||||
name = "Captain Pete's Cuban Spiced Rum"
|
||||
name = "Captain Pete's Cuban spiced rum"
|
||||
desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
|
||||
icon_state = "rumbottle"
|
||||
list_reagents = list("rum" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater
|
||||
name = "Flask of Holy Water"
|
||||
name = "flask of holy water"
|
||||
desc = "A flask of the chaplain's holy water."
|
||||
icon_state = "holyflask"
|
||||
list_reagents = list("holywater" = 100)
|
||||
@@ -195,39 +195,39 @@
|
||||
list_reagents = list("hell_water" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/vermouth
|
||||
name = "Goldeneye Vermouth"
|
||||
name = "Goldeneye vermouth"
|
||||
desc = "Sweet, sweet dryness~"
|
||||
icon_state = "vermouthbottle"
|
||||
list_reagents = list("vermouth" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/kahlua
|
||||
name = "Robert Robust's Coffee Liqueur"
|
||||
name = "Robert Robust's coffee liqueur"
|
||||
desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
|
||||
icon_state = "kahluabottle"
|
||||
list_reagents = list("kahlua" = 100)
|
||||
foodtype = VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
|
||||
name = "College Girl Goldschlager"
|
||||
name = "College Girl goldschlager"
|
||||
desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
|
||||
icon_state = "goldschlagerbottle"
|
||||
list_reagents = list("goldschlager" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/cognac
|
||||
name = "Chateau De Baton Premium Cognac"
|
||||
name = "Chateau de Baton premium cognac"
|
||||
desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
|
||||
icon_state = "cognacbottle"
|
||||
list_reagents = list("cognac" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/wine
|
||||
name = "Doublebeard Bearded Special Wine"
|
||||
name = "Doublebeard's bearded special wine"
|
||||
desc = "A faint aura of unease and asspainery surrounds the bottle."
|
||||
icon_state = "winebottle"
|
||||
list_reagents = list("wine" = 100)
|
||||
foodtype = FRUIT | ALCOHOL
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/absinthe
|
||||
name = "Extra-Strong Absinthe"
|
||||
name = "extra-strong absinthe"
|
||||
desc = "An strong alcoholic drink brewed and distributed by"
|
||||
icon_state = "absinthebottle"
|
||||
list_reagents = list("absinthe" = 100)
|
||||
@@ -272,7 +272,7 @@
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium
|
||||
name = "Gwyn's Premium Absinthe"
|
||||
name = "Gwyn's premium absinthe"
|
||||
desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
|
||||
icon_state = "absinthepremium"
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/lizardwine
|
||||
name = "Bottle of lizard wine"
|
||||
name = "bottle of lizard wine"
|
||||
desc = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol. Inexplicably popular among command staff."
|
||||
icon_state = "lizardwine"
|
||||
list_reagents = list("lizardwine" = 100)
|
||||
@@ -302,7 +302,7 @@
|
||||
//////////////////////////JUICES AND STUFF ///////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
|
||||
name = "Orange Juice"
|
||||
name = "orange juice"
|
||||
desc = "Full of vitamins and deliciousness!"
|
||||
icon_state = "orangejuice"
|
||||
item_state = "carton"
|
||||
@@ -313,7 +313,7 @@
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/cream
|
||||
name = "Milk Cream"
|
||||
name = "milk cream"
|
||||
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
|
||||
icon_state = "cream"
|
||||
item_state = "carton"
|
||||
@@ -324,7 +324,7 @@
|
||||
foodtype = DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
|
||||
name = "Tomato Juice"
|
||||
name = "tomato juice"
|
||||
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
|
||||
icon_state = "tomatojuice"
|
||||
item_state = "carton"
|
||||
@@ -335,7 +335,7 @@
|
||||
foodtype = VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/limejuice
|
||||
name = "Lime Juice"
|
||||
name = "lime juice"
|
||||
desc = "Sweet-sour goodness."
|
||||
icon_state = "limejuice"
|
||||
item_state = "carton"
|
||||
|
||||
@@ -380,7 +380,7 @@
|
||||
foodtype = VEGETABLES | FRIED | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cubannachos
|
||||
name = "cuban nachos"
|
||||
name = "Cuban nachos"
|
||||
desc = "That's some dangerously spicy nachos."
|
||||
icon_state = "cubannachos"
|
||||
bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut
|
||||
name = "donut"
|
||||
desc = "Goes great with Robust Coffee."
|
||||
desc = "Goes great with robust coffee."
|
||||
icon_state = "donut1"
|
||||
bitesize = 5
|
||||
bonus_reagents = list("sugar" = 1)
|
||||
|
||||
@@ -1,187 +0,0 @@
|
||||
|
||||
/obj/machinery/juicer
|
||||
name = "juicer"
|
||||
desc = "A centrifugal juicer with two speeds: Juice and Separate."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "juicer1"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 100
|
||||
pass_flags = PASSTABLE
|
||||
var/obj/item/reagent_containers/beaker
|
||||
var/static/list/allowed_items = list(
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = "tomatojuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/carrot = "carrotjuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries = "berryjuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes = "grapejuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green = "grapejuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana = "banana",
|
||||
/obj/item/reagent_containers/food/snacks/grown/potato = "potato",
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon = "lemonjuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = "orangejuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lime = "limejuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon = "watermelonjuice",
|
||||
/obj/item/reagent_containers/food/snacks/watermelonslice = "watermelonjuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries/poison = "poisonberryjuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice",
|
||||
/obj/item/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice")
|
||||
|
||||
/obj/machinery/juicer/Initialize()
|
||||
. = ..()
|
||||
beaker = new /obj/item/reagent_containers/glass/beaker/large(src)
|
||||
|
||||
/obj/machinery/juicer/update_icon()
|
||||
icon_state = "juicer"+num2text(!isnull(beaker))
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/juicer/attackby(obj/item/O, mob/user, params)
|
||||
if(default_unfasten_wrench(user, O))
|
||||
return
|
||||
if (istype(O, /obj/item/reagent_containers/glass) || \
|
||||
istype(O, /obj/item/reagent_containers/food/drinks/drinkingglass))
|
||||
if (beaker)
|
||||
return 1
|
||||
else
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
to_chat(user, "<span class='warning'>\the [O] is stuck to your hand, you cannot put it in \the [src]!</span>")
|
||||
return 0
|
||||
beaker = O
|
||||
src.verbs += /obj/machinery/juicer/verb/detach
|
||||
update_icon()
|
||||
src.updateUsrDialog()
|
||||
return 0
|
||||
if (!is_type_in_list(O, allowed_items))
|
||||
to_chat(user, "This object contains no fluid or extractable reagents.")
|
||||
return 1
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
to_chat(user, "<span class='warning'>\the [O] is stuck to your hand, you cannot put it in \the [src]!</span>")
|
||||
return 0
|
||||
src.updateUsrDialog()
|
||||
return 0
|
||||
|
||||
/obj/machinery/juicer/attack_paw(mob/user)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/juicer/attack_ai(mob/user)
|
||||
return 0
|
||||
|
||||
/obj/machinery/juicer/attack_hand(mob/user)
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/juicer/interact(mob/user) // The microwave Menu
|
||||
var/is_chamber_empty = 0
|
||||
var/is_beaker_ready = 0
|
||||
var/processing_chamber = ""
|
||||
var/beaker_contents = ""
|
||||
|
||||
for (var/i in allowed_items)
|
||||
for (var/obj/item/O in src.contents)
|
||||
if (!istype(O,i))
|
||||
continue
|
||||
processing_chamber+= "some <B>[O]</B><BR>"
|
||||
break
|
||||
if (!processing_chamber)
|
||||
is_chamber_empty = 1
|
||||
processing_chamber = "Nothing."
|
||||
if (!beaker)
|
||||
beaker_contents = "\The [src] has no container attached."
|
||||
else if (!beaker.reagents.total_volume)
|
||||
beaker_contents = "\The [src] has an empty [beaker] attached."
|
||||
is_beaker_ready = 1
|
||||
else if (beaker.reagents.total_volume < beaker.reagents.maximum_volume)
|
||||
beaker_contents = "\The [src] has a partially filled [beaker] attached."
|
||||
is_beaker_ready = 1
|
||||
else
|
||||
beaker_contents = "\The [src] has a completly filled [beaker] attached!"
|
||||
|
||||
var/dat = {"
|
||||
<b>Processing chamber contains:</b><br>
|
||||
[processing_chamber]<br>
|
||||
[beaker_contents]<hr>
|
||||
"}
|
||||
if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
|
||||
dat += "<A href='?src=[REF(src)];action=juice'>Turn on!<BR>"
|
||||
if (beaker)
|
||||
dat += "<A href='?src=[REF(src)];action=detach'>Detach the container!<BR>"
|
||||
user << browse("<HEAD><TITLE>Juicer</TITLE></HEAD><TT>[dat]</TT>", "window=juicer")
|
||||
onclose(user, "juicer")
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/juicer/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
switch(href_list["action"])
|
||||
if ("juice")
|
||||
juice()
|
||||
|
||||
if ("detach")
|
||||
detach()
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/juicer/verb/detach()
|
||||
set category = "Object"
|
||||
set name = "Detach container from the juicer"
|
||||
set src in oview(1)
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
if (!beaker)
|
||||
return
|
||||
src.verbs -= /obj/machinery/juicer/verb/detach
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/juicer/proc/get_juice_id(obj/item/reagent_containers/food/snacks/grown/O)
|
||||
for (var/i in allowed_items)
|
||||
if (istype(O, i))
|
||||
return allowed_items[i]
|
||||
|
||||
/obj/machinery/juicer/proc/get_juice_amount(obj/item/reagent_containers/food/snacks/grown/O)
|
||||
if (!istype(O) || !O.seed)
|
||||
return 5
|
||||
else if (O.seed.potency == -1)
|
||||
return 5
|
||||
else
|
||||
return round(5*sqrt(O.seed.potency))
|
||||
|
||||
/obj/machinery/juicer/proc/juice()
|
||||
power_change() //it is a portable machine
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if (!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
||||
return
|
||||
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
|
||||
for (var/obj/item/reagent_containers/food/snacks/O in src.contents)
|
||||
var/r_id = get_juice_id(O)
|
||||
beaker.reagents.add_reagent(r_id,get_juice_amount(O))
|
||||
qdel(O)
|
||||
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
||||
break
|
||||
|
||||
/obj/structure/closet/crate/juice/New()
|
||||
..()
|
||||
new/obj/machinery/juicer(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/grapes(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/grapes(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/reagent_containers/food/snacks/grown/grapes(src)
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
/obj/structure/beebox/premade/New()
|
||||
..()
|
||||
|
||||
icon_state = "beebox"
|
||||
var/datum/reagent/R = null
|
||||
if(random_reagent)
|
||||
R = pick(subtypesof(/datum/reagent))
|
||||
@@ -80,6 +81,7 @@
|
||||
|
||||
|
||||
/obj/structure/beebox/premade/random
|
||||
icon_state = "random_beebox"
|
||||
random_reagent = TRUE
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,13 @@
|
||||
mutatelist = list(/obj/item/seeds/watermelon/holy)
|
||||
reagents_add = list("water" = 0.2, "vitamin" = 0.04, "nutriment" = 0.2)
|
||||
|
||||
/obj/item/seeds/watermelon/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is swallowing [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
user.gib()
|
||||
new product(drop_location())
|
||||
qdel(src)
|
||||
return MANUAL_SUICIDE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon
|
||||
seed = /obj/item/seeds/watermelon
|
||||
name = "watermelon"
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
randomize_stats()
|
||||
..()
|
||||
if(prob(60))
|
||||
add_random_reagents()
|
||||
add_random_reagents(1, 3)
|
||||
if(prob(50))
|
||||
add_random_traits()
|
||||
add_random_traits(1, 2)
|
||||
add_random_plant_type(35)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/random
|
||||
|
||||
@@ -207,6 +207,15 @@
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 1)
|
||||
|
||||
/obj/item/integrated_circuit/output/sound/vox
|
||||
name = "ai vox sound circuit"
|
||||
desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in AI announcement systems."
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
|
||||
/obj/item/integrated_circuit/output/sound/vox/Initialize()
|
||||
.= ..()
|
||||
sounds = GLOB.vox_sounds
|
||||
extended_desc = "The first input pin determines which sound is used. It uses the AI Vox Broadcast word list. So either experiment to find words that work, or ask the AI to help in figuring them out. The second pin determines the volume of sound that is played, and the third determines if the frequency of the sound will vary with each activation."
|
||||
|
||||
/obj/item/integrated_circuit/output/text_to_speech
|
||||
name = "text-to-speech circuit"
|
||||
|
||||
@@ -68,7 +68,7 @@ Chaplain
|
||||
B.name = "Guys Gone Wild"
|
||||
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes")
|
||||
B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
|
||||
H.setBrainLoss(100) // starts off retarded as fuck
|
||||
H.adjustBrainLoss(100) // starts off retarded as fuck
|
||||
if("science")
|
||||
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
|
||||
else
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/obj/item/book/manual/random
|
||||
icon_state = "random_book"
|
||||
|
||||
/obj/item/book/manual/random/Initialize()
|
||||
..()
|
||||
var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear, /obj/item/book/manual/wiki)
|
||||
@@ -6,6 +9,7 @@
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/book/random
|
||||
icon_state = "random_book"
|
||||
var/amount = 1
|
||||
var/category = null
|
||||
|
||||
@@ -20,6 +24,7 @@
|
||||
/obj/structure/bookcase/random
|
||||
var/category = null
|
||||
var/book_count = 2
|
||||
icon_state = "random_bookcase"
|
||||
anchored = TRUE
|
||||
state = 2
|
||||
|
||||
|
||||
@@ -94,38 +94,19 @@
|
||||
name = "airlock"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
note_overlay_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
assemblytype = /obj/structure/door_assembly/door_assembly_pod
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/glass
|
||||
opacity = FALSE
|
||||
glass = TRUE
|
||||
var/expected_dir = SOUTH //we visually turn when shuttle rotated, but need to not turn for any other reason
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/setDir(direction)
|
||||
direction = expected_dir
|
||||
..()
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/vertical
|
||||
dir = EAST
|
||||
expected_dir = EAST
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod
|
||||
name = "pod airlock assembly"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
base_name = "pod airlock"
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
airlock_type = /obj/machinery/door/airlock/survival_pod
|
||||
anchored = TRUE
|
||||
state = 1
|
||||
mineral = "glass"
|
||||
material = "glass"
|
||||
var/expected_dir = SOUTH
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/setDir(direction)
|
||||
direction = expected_dir
|
||||
..()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/vertical
|
||||
dir = EAST
|
||||
expected_dir = EAST
|
||||
glass_type = /obj/machinery/door/airlock/survival_pod/glass
|
||||
|
||||
//Windoor
|
||||
/obj/machinery/door/window/survival_pod
|
||||
|
||||
@@ -137,18 +137,10 @@
|
||||
regrowth_time_low = 4800
|
||||
regrowth_time_high = 7200
|
||||
|
||||
/obj/structure/flora/ash/cacti/Crossed(mob/AM)
|
||||
if(ishuman(AM) && has_gravity(loc) && prob(70))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(!H.shoes && !H.lying) //ouch, my feet.
|
||||
var/picked_def_zone = pick("l_leg", "r_leg")
|
||||
var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone)
|
||||
if(!istype(O) || (PIERCEIMMUNE in H.dna.species.species_traits))
|
||||
return
|
||||
H.apply_damage(rand(3, 6), BRUTE, picked_def_zone)
|
||||
H.Knockdown(40)
|
||||
H.visible_message("<span class='danger'>[H] steps on a cactus!</span>", \
|
||||
"<span class='userdanger'>You step on a cactus!</span>")
|
||||
/obj/structure/flora/ash/cacti/Initialize(mapload)
|
||||
. = ..()
|
||||
// min dmg 3, max dmg 6, prob(70)
|
||||
AddComponent(/datum/component/caltrop, 3, 6, 70)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora
|
||||
name = "mushroom shavings"
|
||||
|
||||
@@ -320,7 +320,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
|
||||
to_chat(usr, "<span class='warning'>Another consciousness is in your body...It is resisting you.</span>")
|
||||
return
|
||||
client.change_view(world.view)
|
||||
client.change_view(CONFIG_GET(string/default_view))
|
||||
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
|
||||
mind.current.key = key
|
||||
return 1
|
||||
@@ -456,7 +456,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set desc = "Change your view range."
|
||||
|
||||
var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT
|
||||
if(client.view == world.view)
|
||||
if(client.view == CONFIG_GET(string/default_view))
|
||||
var/list/views = list()
|
||||
for(var/i in 7 to max_view)
|
||||
views |= i
|
||||
@@ -464,7 +464,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(new_view)
|
||||
client.change_view(Clamp(new_view, 7, max_view))
|
||||
else
|
||||
client.change_view(world.view)
|
||||
client.change_view(CONFIG_GET(string/default_view))
|
||||
|
||||
/mob/dead/observer/verb/add_view_range(input as num)
|
||||
set name = "Add View Range"
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
var/damaged_brain = FALSE //whether the brain organ is damaged.
|
||||
var/decoy_override = FALSE //I apologize to the security players, and myself, who abused this, but this is going to go.
|
||||
|
||||
var/list/datum/brain_trauma/traumas = list()
|
||||
|
||||
/obj/item/organ/brain/changeling_brain
|
||||
vital = FALSE
|
||||
decoy_override = TRUE
|
||||
@@ -41,11 +43,21 @@
|
||||
|
||||
QDEL_NULL(brainmob)
|
||||
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
BT.owner = owner
|
||||
BT.on_gain()
|
||||
|
||||
//Update the body's icon so it doesnt appear debrained anymore
|
||||
C.update_hair()
|
||||
|
||||
/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE)
|
||||
..()
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
BT.on_lose(TRUE)
|
||||
BT.owner = null
|
||||
|
||||
if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer)
|
||||
transfer_identity(C)
|
||||
C.update_hair()
|
||||
@@ -134,6 +146,30 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/organ/brain/proc/get_brain_damage()
|
||||
var/brain_damage_threshold = max_integrity * BRAIN_DAMAGE_INTEGRITY_MULTIPLIER
|
||||
var/offset_integrity = obj_integrity - (max_integrity - brain_damage_threshold)
|
||||
. = (1 - (offset_integrity / brain_damage_threshold)) * BRAIN_DAMAGE_DEATH
|
||||
|
||||
/obj/item/organ/brain/proc/adjust_brain_damage(amount, maximum)
|
||||
var/adjusted_amount
|
||||
if(amount >= 0 && maximum)
|
||||
var/brainloss = get_brain_damage()
|
||||
var/new_brainloss = Clamp(brainloss + amount, 0, maximum)
|
||||
if(brainloss > new_brainloss) //brainloss is over the cap already
|
||||
return 0
|
||||
adjusted_amount = new_brainloss - brainloss
|
||||
else
|
||||
adjusted_amount = amount
|
||||
|
||||
adjusted_amount *= BRAIN_DAMAGE_INTEGRITY_MULTIPLIER
|
||||
if(adjusted_amount)
|
||||
if(adjusted_amount >= 0.1)
|
||||
take_damage(adjusted_amount)
|
||||
else if(adjusted_amount <= -0.1)
|
||||
obj_integrity = min(max_integrity, obj_integrity-adjusted_amount)
|
||||
. = adjusted_amount
|
||||
|
||||
/obj/item/organ/brain/Destroy() //copypasted from MMIs.
|
||||
if(brainmob)
|
||||
qdel(brainmob)
|
||||
@@ -145,3 +181,46 @@
|
||||
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
|
||||
icon_state = "brain-x"
|
||||
origin_tech = "biotech=6"
|
||||
|
||||
|
||||
////////////////////////////////////TRAUMAS////////////////////////////////////////
|
||||
|
||||
/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE)
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
if(istype(BT, brain_trauma_type) && (consider_permanent || !BT.permanent))
|
||||
return BT
|
||||
|
||||
|
||||
//Add a specific trauma
|
||||
/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments)
|
||||
var/trauma_type
|
||||
if(ispath(trauma))
|
||||
trauma_type = trauma
|
||||
traumas += new trauma_type(arglist(list(src, permanent) + arguments))
|
||||
else
|
||||
traumas += trauma
|
||||
trauma.permanent = permanent
|
||||
|
||||
//Add a random trauma of a certain subtype
|
||||
/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE)
|
||||
var/list/datum/brain_trauma/possible_traumas = list()
|
||||
for(var/T in subtypesof(brain_trauma_type))
|
||||
var/datum/brain_trauma/BT = T
|
||||
if(initial(BT.can_gain))
|
||||
possible_traumas += BT
|
||||
|
||||
var/trauma_type = pick(possible_traumas)
|
||||
traumas += new trauma_type(src, permanent)
|
||||
|
||||
//Cure a random trauma of a certain subtype
|
||||
/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE)
|
||||
var/datum/brain_trauma/trauma = has_trauma_type(brain_trauma_type)
|
||||
if(trauma && (cure_permanent || !trauma.permanent))
|
||||
qdel(trauma)
|
||||
|
||||
/obj/item/organ/brain/proc/cure_all_traumas(cure_permanent = FALSE)
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/trauma = X
|
||||
if(cure_permanent || !trauma.permanent)
|
||||
qdel(trauma)
|
||||
|
||||
@@ -22,4 +22,4 @@
|
||||
return
|
||||
|
||||
/mob/living/brain/set_blurriness()
|
||||
return
|
||||
return
|
||||
@@ -112,7 +112,8 @@
|
||||
take_bodypart_damage(10)
|
||||
victim.Knockdown(20)
|
||||
Knockdown(20)
|
||||
visible_message("<span class='danger'>[src] crashes into [victim], knocking them both over!</span>", "<span class='userdanger'>You violently crash into [victim]!</span>")
|
||||
visible_message("<span class='danger'>[src] crashes into [victim], knocking them both over!</span>",\
|
||||
"<span class='userdanger'>You violently crash into [victim]!</span>")
|
||||
playsound(src,'sound/weapons/punch1.ogg',50,1)
|
||||
|
||||
|
||||
@@ -765,6 +766,7 @@
|
||||
update_handcuffed()
|
||||
if(reagents)
|
||||
reagents.addiction_list = list()
|
||||
cure_all_traumas(TRUE, TRUE)
|
||||
..()
|
||||
// heal ears after healing disabilities, since ears check DEAF disability
|
||||
// when healing.
|
||||
@@ -849,3 +851,5 @@
|
||||
.["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]"
|
||||
.["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]"
|
||||
.["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]"
|
||||
.["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]"
|
||||
.["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]"
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
|
||||
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
||||
)
|
||||
)
|
||||
jitteriness += 1000 //High numbers for violent convulsions
|
||||
do_jitter_animation(jitteriness)
|
||||
stuttering += 2
|
||||
|
||||
@@ -196,3 +196,37 @@
|
||||
staminaloss = amount
|
||||
if(updating_stamina)
|
||||
update_stamina()
|
||||
|
||||
/mob/living/carbon/getBrainLoss()
|
||||
. = BRAIN_DAMAGE_DEATH
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.get_brain_damage()
|
||||
|
||||
//Some sources of brain damage shouldn't be deadly
|
||||
/mob/living/carbon/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH)
|
||||
if(status_flags & GODMODE)
|
||||
return 0
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(!B)
|
||||
return
|
||||
B.adjust_brain_damage(amount, maximum)
|
||||
if(amount <= 0) //cut this early
|
||||
return
|
||||
var/brainloss = getBrainLoss()
|
||||
if(brainloss > BRAIN_DAMAGE_MILD && !has_trauma_type(BRAIN_TRAUMA_MILD))
|
||||
if(prob((amount * 2) + ((brainloss - BRAIN_DAMAGE_MILD) / 5))) //1 damage|50 brain damage = 4% chance
|
||||
gain_trauma_type(BRAIN_TRAUMA_MILD)
|
||||
if(brainloss > BRAIN_DAMAGE_SEVERE && !has_trauma_type(BRAIN_TRAUMA_SEVERE) && !has_trauma_type(BRAIN_TRAUMA_SPECIAL))
|
||||
if(prob(amount + ((brainloss - BRAIN_DAMAGE_SEVERE) / 15))) //1 damage|150 brain damage = 3% chance
|
||||
if(prob(20))
|
||||
gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
|
||||
else
|
||||
gain_trauma_type(BRAIN_TRAUMA_SEVERE)
|
||||
|
||||
/mob/living/carbon/setBrainLoss(amount)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
var/adjusted_amount = amount - B.get_brain_damage()
|
||||
B.adjust_brain_damage(adjusted_amount, null)
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
else
|
||||
msg += "<b>[t_He] [t_is] severely deformed!</b>\n"
|
||||
|
||||
if(getBrainLoss() > 60)
|
||||
if(disabilities & DUMB)
|
||||
msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n"
|
||||
|
||||
if(fire_stacks > 0)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
var/t_has = p_have()
|
||||
var/t_is = p_are()
|
||||
|
||||
var/msg = "<span class='info'>*---------*\nThis is <EM>[src.name]</EM>!\n"
|
||||
var/msg = "<span class='info'>*---------*\nThis is <EM>[name]</EM>!\n"
|
||||
|
||||
var/list/obscured = check_obscured_slots()
|
||||
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
|
||||
@@ -284,7 +284,7 @@
|
||||
if(stat == UNCONSCIOUS)
|
||||
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
|
||||
else
|
||||
if(getBrainLoss() >= 60)
|
||||
if(disabilities & DUMB)
|
||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||
if(InCritical())
|
||||
msg += "[t_He] [t_is] barely conscious.\n"
|
||||
|
||||
@@ -103,7 +103,9 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/IsAdvancedToolUser()
|
||||
return 1//Humans can use guns and such
|
||||
if(disabilities & MONKEYLIKE)
|
||||
return FALSE
|
||||
return TRUE//Humans can use guns and such
|
||||
|
||||
/mob/living/carbon/human/reagent_check(datum/reagent/R)
|
||||
return dna.species.handle_chemicals(R,src)
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
|
||||
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
|
||||
|
||||
#define BRAIN_DAMAGE_FILE "brain_damage_lines.json"
|
||||
|
||||
/mob/living/carbon/human/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
@@ -74,14 +72,6 @@
|
||||
else if(eye_blurry) //blurry eyes heal slowly
|
||||
adjust_blurriness(-1)
|
||||
|
||||
if (getBrainLoss() >= 60 && stat == CONSCIOUS)
|
||||
if(prob(3))
|
||||
if(prob(25))
|
||||
emote("drool")
|
||||
else
|
||||
say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
|
||||
|
||||
|
||||
/mob/living/carbon/human/handle_mutations_and_radiation()
|
||||
if(!dna || !dna.species.handle_mutations_and_radiation(src))
|
||||
..()
|
||||
@@ -430,7 +420,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
to_chat(src, "<span class='warning'>Maybe you should lie down for a bit...</span>")
|
||||
|
||||
if(drunkenness >= 91)
|
||||
adjustBrainLoss(0.4)
|
||||
adjustBrainLoss(0.4, 60)
|
||||
if(prob(20) && !stat)
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && (z in GLOB.station_z_levels)) //QoL mainly
|
||||
to_chat(src, "<span class='warning'>You're so tired... but you can't miss that shuttle...</span>")
|
||||
|
||||
@@ -1359,8 +1359,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
target.apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
add_logs(user, target, "punched")
|
||||
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
|
||||
target.visible_message("<span class='danger'>[user] has weakened [target]!</span>", \
|
||||
"<span class='userdanger'>[user] has weakened [target]!</span>")
|
||||
target.visible_message("<span class='danger'>[user] has knocked [target] down!</span>", \
|
||||
"<span class='userdanger'>[user] has knocked [target] down!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
target.apply_effect(80, KNOCKDOWN, armor_block)
|
||||
target.forcesay(GLOB.hit_appends)
|
||||
else if(target.lying)
|
||||
@@ -1404,7 +1404,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(randn <= 60)
|
||||
var/obj/item/I = null
|
||||
if(target.pulling)
|
||||
to_chat(target, "<span class='warning'>[user] has broken [target]'s grip on [target.pulling]!</span>")
|
||||
target.visible_message("<span class='warning'>[user] has broken [target]'s grip on [target.pulling]!</span>")
|
||||
target.stop_pulling()
|
||||
else
|
||||
I = target.get_active_held_item()
|
||||
@@ -1509,7 +1509,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.visible_message("<span class='danger'>[H] has been knocked senseless!</span>", \
|
||||
"<span class='userdanger'>[H] has been knocked senseless!</span>")
|
||||
H.confused = max(H.confused, 20)
|
||||
H.adjustBrainLoss(20)
|
||||
H.adjust_blurriness(10)
|
||||
if(prob(20))
|
||||
H.gain_trauma(/datum/brain_trauma/mild/concussion)
|
||||
|
||||
if(prob(I.force + ((100 - H.health)/2)) && H != user)
|
||||
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
amount = dna.species.spec_stun(src,amount)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canstun = 0)
|
||||
/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canknockdown = 0)
|
||||
amount = dna.species.spec_stun(src,amount)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canstun = 0)
|
||||
/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0)
|
||||
amount = dna.species.spec_stun(src,amount)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ There are several things that need to be remembered:
|
||||
update_observer_view(wear_id)
|
||||
|
||||
//TODO: add an icon file for ID slot stuff, so it's less snowflakey
|
||||
id_overlay = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi')
|
||||
id_overlay = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = ((wear_id.icon_override) ? wear_id.icon_override : 'icons/mob/mob.dmi'))
|
||||
if(OFFSET_ID in dna.species.offset_features)
|
||||
id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1]
|
||||
id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2]
|
||||
@@ -195,7 +195,7 @@ There are several things that need to be remembered:
|
||||
var/t_state = gloves.item_state
|
||||
if(!t_state)
|
||||
t_state = gloves.icon_state
|
||||
overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi')
|
||||
overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = ((gloves.icon_override) ? gloves.icon_override : 'icons/mob/hands.dmi'))
|
||||
gloves_overlay = overlays_standing[GLOVES_LAYER]
|
||||
if(OFFSET_GLOVES in dna.species.offset_features)
|
||||
gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1]
|
||||
@@ -221,7 +221,7 @@ There are several things that need to be remembered:
|
||||
client.screen += glasses //Either way, add the item to the HUD
|
||||
update_observer_view(glasses,1)
|
||||
if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
|
||||
overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi')
|
||||
overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = ((glasses.icon_override) ? glasses.icon_override : 'icons/mob/eyes.dmi'))
|
||||
var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER]
|
||||
if(glasses_overlay)
|
||||
if(OFFSET_GLASSES in dna.species.offset_features)
|
||||
@@ -248,7 +248,7 @@ There are several things that need to be remembered:
|
||||
client.screen += ears //add it to the client's screen
|
||||
update_observer_view(ears,1)
|
||||
|
||||
overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi')
|
||||
overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = ((ears.icon_override) ? ears.icon_override : 'icons/mob/ears.dmi'))
|
||||
var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
|
||||
if(OFFSET_EARS in dna.species.offset_features)
|
||||
ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1]
|
||||
@@ -273,7 +273,7 @@ There are several things that need to be remembered:
|
||||
if(hud_used.inventory_shown) //if the inventory is open
|
||||
client.screen += shoes //add it to client's screen
|
||||
update_observer_view(shoes,1)
|
||||
overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi')
|
||||
overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = ((shoes.icon_override) ? shoes.icon_override : 'icons/mob/feet.dmi'))
|
||||
var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
|
||||
if(OFFSET_SHOES in dna.species.offset_features)
|
||||
shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
|
||||
@@ -297,7 +297,7 @@ There are several things that need to be remembered:
|
||||
var/t_state = s_store.item_state
|
||||
if(!t_state)
|
||||
t_state = s_store.icon_state
|
||||
overlays_standing[SUIT_STORE_LAYER] = mutable_appearance('icons/mob/belt_mirror.dmi', t_state, -SUIT_STORE_LAYER)
|
||||
overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.icon_override) ? s_store.icon_override : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER)
|
||||
var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_LAYER]
|
||||
if(OFFSET_S_STORE in dna.species.offset_features)
|
||||
s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
|
||||
@@ -335,7 +335,7 @@ There are several things that need to be remembered:
|
||||
if(!t_state)
|
||||
t_state = belt.icon_state
|
||||
|
||||
overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi')
|
||||
overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = ((belt.icon_override) ? belt.icon_override : 'icons/mob/belt.dmi'))
|
||||
var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER]
|
||||
if(OFFSET_BELT in dna.species.offset_features)
|
||||
belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1]
|
||||
@@ -359,7 +359,7 @@ There are several things that need to be remembered:
|
||||
client.screen += wear_suit
|
||||
update_observer_view(wear_suit,1)
|
||||
|
||||
overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi')
|
||||
overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = ((wear_suit.icon_override) ? wear_suit.icon_override : 'icons/mob/suit.dmi'))
|
||||
var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
|
||||
if(OFFSET_SUIT in dna.species.offset_features)
|
||||
suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1]
|
||||
|
||||
@@ -13,9 +13,11 @@
|
||||
handle_blood()
|
||||
|
||||
if(stat != DEAD)
|
||||
for(var/V in internal_organs)
|
||||
var/obj/item/organ/O = V
|
||||
O.on_life()
|
||||
handle_brain_damage()
|
||||
|
||||
if(stat != DEAD)
|
||||
handle_liver()
|
||||
|
||||
if(stat == DEAD)
|
||||
stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
|
||||
@@ -437,3 +439,20 @@
|
||||
adjustToxLoss(8)
|
||||
if(prob(30))
|
||||
to_chat(src, "<span class='notice'>You feel confused and nauseous...</span>")//actual symptoms of liver failure
|
||||
|
||||
|
||||
////////////////
|
||||
//BRAIN DAMAGE//
|
||||
////////////////
|
||||
|
||||
/mob/living/carbon/proc/handle_brain_damage()
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/BT = T
|
||||
BT.on_life()
|
||||
|
||||
if(getBrainLoss() >= BRAIN_DAMAGE_DEATH) //rip
|
||||
to_chat(src, "<span class='userdanger'>The last spark of life in your brain fizzles out...<span>")
|
||||
death()
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
B.damaged_brain = TRUE
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/mob/living/carbon/treat_message(message)
|
||||
for(var/datum/brain_trauma/trauma in get_traumas())
|
||||
message = trauma.on_say(message)
|
||||
message = ..(message)
|
||||
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
|
||||
if(!T) //hoooooouaah!
|
||||
@@ -35,3 +37,11 @@
|
||||
. = T.could_speak_in_language(dt)
|
||||
else
|
||||
. = initial(dt.flags_1) & TONGUELESS_SPEECH
|
||||
|
||||
/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
if(!client)
|
||||
return
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/trauma = T
|
||||
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
|
||||
return ..()
|
||||
|
||||
@@ -101,3 +101,35 @@
|
||||
status_flags |= DISFIGURED //makes them unknown
|
||||
update_body()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/proc/get_traumas()
|
||||
. = list()
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.traumas
|
||||
|
||||
/mob/living/carbon/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.has_trauma_type(brain_trauma_type, consider_permanent)
|
||||
|
||||
/mob/living/carbon/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.gain_trauma(trauma, permanent, arguments)
|
||||
|
||||
/mob/living/carbon/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.gain_trauma_type(brain_trauma_type, permanent)
|
||||
|
||||
/mob/living/carbon/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.cure_trauma_type(brain_trauma_type, cure_permanent)
|
||||
|
||||
/mob/living/carbon/proc/cure_all_traumas(cure_permanent = FALSE)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.cure_all_traumas(cure_permanent)
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
|
||||
if(wear_mask)
|
||||
if(!(head && (head.flags_inv & HIDEMASK)))
|
||||
overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi')
|
||||
overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = ((wear_mask.icon_override) ? wear_mask.icon_override : 'icons/mob/mask.dmi'))
|
||||
update_hud_wear_mask(wear_mask)
|
||||
|
||||
apply_overlay(FACEMASK_LAYER)
|
||||
@@ -138,7 +138,7 @@
|
||||
|
||||
if(wear_neck)
|
||||
if(!(head && (head.flags_inv & HIDENECK)))
|
||||
overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi')
|
||||
overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = ((wear_neck.icon_override) ? wear_neck.icon_override : 'icons/mob/neck.dmi'))
|
||||
update_hud_neck(wear_neck)
|
||||
|
||||
apply_overlay(NECK_LAYER)
|
||||
@@ -151,7 +151,7 @@
|
||||
inv.update_icon()
|
||||
|
||||
if(back)
|
||||
overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi')
|
||||
overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = ((back.icon_override) ? back.icon_override : 'icons/mob/back.dmi'))
|
||||
update_hud_back(back)
|
||||
|
||||
apply_overlay(BACK_LAYER)
|
||||
@@ -167,7 +167,7 @@
|
||||
inv.update_icon()
|
||||
|
||||
if(head)
|
||||
overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi')
|
||||
overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = ((head.icon_override) ? head.icon_override : 'icons/mob/head.dmi'))
|
||||
update_hud_head(head)
|
||||
|
||||
apply_overlay(HEAD_LAYER)
|
||||
|
||||
@@ -231,17 +231,13 @@
|
||||
return amount
|
||||
|
||||
/mob/living/proc/getBrainLoss()
|
||||
return brainloss
|
||||
. = 0
|
||||
|
||||
/mob/living/proc/adjustBrainLoss(amount)
|
||||
if(status_flags & GODMODE)
|
||||
return 0
|
||||
brainloss = Clamp((brainloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
||||
/mob/living/proc/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH)
|
||||
return
|
||||
|
||||
/mob/living/proc/setBrainLoss(amount)
|
||||
if(status_flags & GODMODE)
|
||||
return 0
|
||||
brainloss = amount
|
||||
return
|
||||
|
||||
/mob/living/proc/getStaminaLoss()
|
||||
return staminaloss
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
var/toxloss = 0 //Toxic damage caused by being poisoned or radiated
|
||||
var/fireloss = 0 //Burn damage caused by being way too hot, too cold or burnt.
|
||||
var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims
|
||||
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
|
||||
var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this.
|
||||
|
||||
|
||||
|
||||
@@ -326,7 +326,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return null
|
||||
|
||||
/mob/living/proc/treat_message(message)
|
||||
if(getBrainLoss() >= 60)
|
||||
if(derpspeech)
|
||||
message = derpspeech(message, stuttering)
|
||||
|
||||
if(stuttering)
|
||||
@@ -373,7 +373,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
. = "[verb_whisper] in [p_their()] last breath"
|
||||
else if(stuttering)
|
||||
. = "stammers"
|
||||
else if(getBrainLoss() >= 60)
|
||||
else if(derpspeech)
|
||||
. = "gibbers"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
@@ -817,7 +817,8 @@
|
||||
return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override
|
||||
//AI is carded/shunted
|
||||
//view(src) returns nothing for carded/shunted AIs and they have x-ray vision so just use get_dist
|
||||
return get_dist(src, A) <= client.view
|
||||
var/list/viewscale = getviewsize(client.view)
|
||||
return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5)
|
||||
|
||||
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
|
||||
|
||||
@@ -114,12 +114,14 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
var/datum/action/innate/pai/software/SW = new
|
||||
var/datum/action/innate/pai/shell/AS = new /datum/action/innate/pai/shell
|
||||
var/datum/action/innate/pai/chassis/AC = new /datum/action/innate/pai/chassis
|
||||
var/datum/action/innate/pai/rest/AR = new /datum/action/innate/pai/rest
|
||||
var/datum/action/innate/pai/light/AL = new /datum/action/innate/pai/light
|
||||
|
||||
var/datum/action/language_menu/ALM = new
|
||||
SW.Grant(src)
|
||||
AS.Grant(src)
|
||||
AC.Grant(src)
|
||||
AR.Grant(src)
|
||||
@@ -200,6 +202,15 @@
|
||||
return 0
|
||||
P = owner
|
||||
|
||||
/datum/action/innate/pai/software
|
||||
name = "Software Interface"
|
||||
button_icon_state = "pai"
|
||||
background_icon_state = "bg_tech"
|
||||
|
||||
/datum/action/innate/pai/software/Trigger()
|
||||
..()
|
||||
P.paiInterface()
|
||||
|
||||
/datum/action/innate/pai/shell
|
||||
name = "Toggle Holoform"
|
||||
button_icon_state = "pai_holoform"
|
||||
|
||||
@@ -22,9 +22,7 @@
|
||||
"remote signaller" = 5,
|
||||
)
|
||||
|
||||
/mob/living/silicon/pai/verb/paiInterface()
|
||||
set category = "pAI Commands"
|
||||
set name = "Software Interface"
|
||||
/mob/living/silicon/pai/proc/paiInterface()
|
||||
var/dat = ""
|
||||
var/left_part = ""
|
||||
var/right_part = softwareMenu()
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0)
|
||||
if(ionpulse())
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/robot/movement_delay()
|
||||
. = ..()
|
||||
var/static/config_robot_delay
|
||||
if(isnull(config_robot_delay))
|
||||
config_robot_delay = CONFIG_GET(number/robot_delay)
|
||||
. += speed + config_robot_delay
|
||||
|
||||
/mob/living/silicon/robot/mob_negates_gravity()
|
||||
return magpulse
|
||||
|
||||
/mob/living/silicon/robot/mob_has_gravity()
|
||||
return ..() || mob_negates_gravity()
|
||||
|
||||
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
|
||||
if(!magpulse)
|
||||
return ..()
|
||||
/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0)
|
||||
if(ionpulse())
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/robot/movement_delay()
|
||||
. = ..()
|
||||
var/static/config_robot_delay
|
||||
if(isnull(config_robot_delay))
|
||||
config_robot_delay = CONFIG_GET(number/robot_delay)
|
||||
. += speed + config_robot_delay
|
||||
|
||||
/mob/living/silicon/robot/mob_negates_gravity()
|
||||
return magpulse
|
||||
|
||||
/mob/living/silicon/robot/mob_has_gravity()
|
||||
return ..() || mob_negates_gravity()
|
||||
|
||||
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
|
||||
if(!magpulse)
|
||||
return ..()
|
||||
|
||||
@@ -10,14 +10,14 @@
|
||||
var/mob/living/silicon/S = src
|
||||
desig = trim_left(S.designation + " " + S.job)
|
||||
var/message_a = say_quote(message, get_spans())
|
||||
var/rendered = "<span class='binarysay'>Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span>"
|
||||
var/rendered = "Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span>"
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.binarycheck())
|
||||
if(isAI(M))
|
||||
var/renderedAI = "<span class='binarysay'>Robotic Talk, <a href='?src=[REF(M)];track=[html_encode(name)]'><span class='name'>[name] ([desig])</span></a> <span class='message'>[message_a]</span></span>"
|
||||
to_chat(M, renderedAI)
|
||||
else
|
||||
to_chat(M, rendered)
|
||||
to_chat(M, "<span class='binarysay'>[rendered]</span>")
|
||||
if(isobserver(M))
|
||||
var/following = src
|
||||
// If the AI talks on binary chat, we still want to follow
|
||||
@@ -26,7 +26,7 @@
|
||||
var/mob/living/silicon/ai/ai = src
|
||||
following = ai.eyeobj
|
||||
var/link = FOLLOW_LINK(M, following)
|
||||
to_chat(M, "[link] [rendered]")
|
||||
to_chat(M, "<span class='binarysay'>[link] [rendered]</span>")
|
||||
|
||||
/mob/living/silicon/binarycheck()
|
||||
return 1
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
model = "MULE"
|
||||
bot_core_type = /obj/machinery/bot_core/mulebot
|
||||
|
||||
suffix = ""
|
||||
var/id
|
||||
|
||||
path_image_color = "#7F5200"
|
||||
|
||||
@@ -60,8 +60,8 @@
|
||||
|
||||
var/static/mulebot_count = 0
|
||||
mulebot_count += 1
|
||||
if(!suffix)
|
||||
set_suffix("#[mulebot_count]")
|
||||
set_id(suffix || id || "#[mulebot_count]")
|
||||
suffix = null
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/Destroy()
|
||||
unload(0)
|
||||
@@ -69,12 +69,12 @@
|
||||
wires = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/proc/set_suffix(suffix)
|
||||
src.suffix = suffix
|
||||
/mob/living/simple_animal/bot/mulebot/proc/set_id(new_id)
|
||||
id = new_id
|
||||
if(paicard)
|
||||
bot_name = "\improper MULEbot ([suffix])"
|
||||
bot_name = "\improper MULEbot ([new_id])"
|
||||
else
|
||||
name = "\improper MULEbot ([suffix])"
|
||||
name = "\improper MULEbot ([new_id])"
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/bot_reset()
|
||||
..()
|
||||
@@ -233,9 +233,9 @@
|
||||
if(new_dest)
|
||||
set_destination(new_dest)
|
||||
if("setid")
|
||||
var/new_id = stripped_input(user, "Enter ID:", name, suffix, MAX_NAME_LEN)
|
||||
var/new_id = stripped_input(user, "Enter ID:", name, id, MAX_NAME_LEN)
|
||||
if(new_id)
|
||||
set_suffix(new_id)
|
||||
set_id(new_id)
|
||||
if("sethome")
|
||||
var/new_home = input(user, "Enter Home:", name, home_destination) as null|anything in GLOB.deliverybeacontags
|
||||
if(new_home)
|
||||
@@ -260,7 +260,7 @@
|
||||
var/ai = issilicon(user)
|
||||
var/dat
|
||||
dat += "<h3>Multiple Utility Load Effector Mk. V</h3>"
|
||||
dat += "<b>ID:</b> [suffix]<BR>"
|
||||
dat += "<b>ID:</b> [id]<BR>"
|
||||
dat += "<b>Power:</b> [on ? "On" : "Off"]<BR>"
|
||||
dat += "<h3>Status</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
gender = MALE
|
||||
speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
|
||||
speak_emote = list("purrs", "meows")
|
||||
emote_hear = list("meows", "mews")
|
||||
emote_see = list("shakes its head", "shivers")
|
||||
emote_hear = list("meows.", "mews.")
|
||||
emote_see = list("shakes its head.", "shivers.")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
@@ -22,7 +22,7 @@
|
||||
unsuitable_atmos_damage = 1
|
||||
animal_species = /mob/living/simple_animal/pet/cat
|
||||
childtype = list(/mob/living/simple_animal/pet/cat/kitten)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1)
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
|
||||
@@ -962,7 +962,7 @@
|
||||
playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 75, TRUE)
|
||||
var/mob/living/simple_animal/parrot/clock_hawk/H = new(loc)
|
||||
H.setDir(dir)
|
||||
dust()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/ghost
|
||||
name = "The Ghost of Poly"
|
||||
|
||||
@@ -35,11 +35,18 @@
|
||||
|
||||
client.sethotkeys() //set mob specific hotkeys
|
||||
|
||||
//Reload alternate appearances
|
||||
for(var/v in GLOB.active_alternate_appearances)
|
||||
if(!v)
|
||||
continue
|
||||
var/datum/atom_hud/alternate_appearance/AA = v
|
||||
AA.onNewMob(src)
|
||||
|
||||
update_client_colour()
|
||||
if(client)
|
||||
client.click_intercept = null
|
||||
|
||||
client.change_view(world.view) // Resets the client.view in case it was changed.
|
||||
client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed.
|
||||
|
||||
if(!GLOB.individual_log_list[ckey])
|
||||
GLOB.individual_log_list[ckey] = logging
|
||||
|
||||
@@ -400,6 +400,7 @@
|
||||
pulling = null
|
||||
grab_state = 0
|
||||
update_pull_hud_icon()
|
||||
|
||||
if(isliving(ex_pulled))
|
||||
var/mob/living/L = ex_pulled
|
||||
L.update_canmove()// mob gets up if it was lyng down in a chokehold
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
var/stuttering = 0 //Carbon
|
||||
var/slurring = 0 //Carbon
|
||||
var/cultslurring = 0 //Carbon
|
||||
var/derpspeech = 0 //Carbon
|
||||
var/real_name = null
|
||||
var/spacewalk = FALSE
|
||||
var/druggy = 0 //Carbon
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
O.setBrainLoss(getBrainLoss(), 0)
|
||||
O.updatehealth()
|
||||
O.radiation = radiation
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/BT = T
|
||||
O.gain_trauma(BT.type, BT.permanent)
|
||||
|
||||
//re-add implants to new mob
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
@@ -238,6 +241,9 @@
|
||||
O.setBrainLoss(getBrainLoss(), 0)
|
||||
O.updatehealth()
|
||||
O.radiation = radiation
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/BT = T
|
||||
O.gain_trauma(BT.type, BT.permanent)
|
||||
|
||||
//re-add implants to new mob
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
|
||||
@@ -45,11 +45,6 @@
|
||||
to_chat(M, "<span class='boldnotice'>You feel that your soul has returned to its rightful owner, Nanotrasen.</span>")
|
||||
M.return_soul()
|
||||
else
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/N = M
|
||||
if(!istype(N.head, /obj/item/clothing/head/helmet))
|
||||
N.adjustBrainLoss(10)
|
||||
to_chat(N, "<span class='danger'>You feel dumber.</span>")
|
||||
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] beats [M] over the head with [src]!</span>")
|
||||
return ..()
|
||||
@@ -207,7 +202,7 @@
|
||||
if(!user.mind.hasSoul)
|
||||
to_chat(user, "<span class='notice'>You do not possess a soul.</span>")
|
||||
return 0
|
||||
if(prob(user.getBrainLoss()))
|
||||
if(user.disabilities & DUMB)
|
||||
to_chat(user, "<span class='notice'>You quickly scrawl 'your name' on the contract.</span>")
|
||||
signIncorrectly()
|
||||
return 0
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//
|
||||
// consists of light fixtures (/obj/machinery/light) and light tube/bulb items (/obj/item/light)
|
||||
|
||||
|
||||
#define LIGHT_EMERGENCY_POWER_USE 0.2 //How much power emergency lights will consume per tick
|
||||
// status values shared between lighting fixtures and items
|
||||
#define LIGHT_OK 0
|
||||
#define LIGHT_EMPTY 1
|
||||
@@ -284,7 +284,6 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/light/update_icon()
|
||||
|
||||
switch(status) // set icon_states
|
||||
if(LIGHT_OK)
|
||||
if(emergency_mode)
|
||||
@@ -293,18 +292,17 @@
|
||||
icon_state = "[base_state][on]"
|
||||
if(LIGHT_EMPTY)
|
||||
icon_state = "[base_state]-empty"
|
||||
on = FALSE
|
||||
if(LIGHT_BURNED)
|
||||
icon_state = "[base_state]-burned"
|
||||
on = FALSE
|
||||
if(LIGHT_BROKEN)
|
||||
icon_state = "[base_state]-broken"
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
// update the icon_state and luminosity of the light depending on its state
|
||||
/obj/machinery/light/proc/update(trigger = 1)
|
||||
|
||||
switch(status)
|
||||
if(LIGHT_BROKEN,LIGHT_BURNED,LIGHT_EMPTY)
|
||||
on = FALSE
|
||||
emergency_mode = FALSE
|
||||
if(on)
|
||||
if(!light || light.light_range != brightness)
|
||||
@@ -318,7 +316,7 @@
|
||||
else
|
||||
use_power = ACTIVE_POWER_USE
|
||||
set_light(brightness, 1, "#FFFFFF")
|
||||
else if(has_emergency_power() && !turned_off())
|
||||
else if(has_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off())
|
||||
use_power = IDLE_POWER_USE
|
||||
emergency_mode = TRUE
|
||||
else
|
||||
@@ -338,8 +336,8 @@
|
||||
|
||||
/obj/machinery/light/process()
|
||||
if(has_power() && cell)
|
||||
cell.charge = min(cell.maxcharge, cell.charge + 0.2) //Recharge emergency power automatically while not using it
|
||||
if(emergency_mode && !use_emergency_power(0.2))
|
||||
cell.charge = min(cell.maxcharge, cell.charge + LIGHT_EMERGENCY_POWER_USE) //Recharge emergency power automatically while not using it
|
||||
if(emergency_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE))
|
||||
update(FALSE) //Disables emergency mode and sets the color to normal
|
||||
|
||||
/obj/machinery/light/proc/burn_out()
|
||||
@@ -494,7 +492,7 @@
|
||||
// if a light is turned off, it won't activate emergency power
|
||||
/obj/machinery/light/proc/turned_off()
|
||||
var/area/A = get_area(src)
|
||||
return !A.lightswitch && A.power_light
|
||||
return !A.lightswitch && A.power_light || !flickering
|
||||
|
||||
// returns whether this light has power
|
||||
// true if area has power and lightswitch is on
|
||||
@@ -511,7 +509,7 @@
|
||||
return status == LIGHT_OK
|
||||
|
||||
// attempts to use power from the installed emergency cell, returns true if it does and false if it doesn't
|
||||
/obj/machinery/light/proc/use_emergency_power(pwr = 0.2)
|
||||
/obj/machinery/light/proc/use_emergency_power(pwr = LIGHT_EMERGENCY_POWER_USE)
|
||||
if(!has_emergency_power(pwr))
|
||||
return FALSE
|
||||
if(cell.charge > 300) //it's meant to handle 120 W, ya doofus
|
||||
@@ -678,7 +676,7 @@
|
||||
force = 2
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
|
||||
var/status = LIGHT_OK // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
|
||||
var/base_state
|
||||
var/switchcount = 0 // number of times switched
|
||||
materials = list(MAT_GLASS=100)
|
||||
@@ -761,7 +759,7 @@
|
||||
|
||||
/obj/item/light/proc/shatter()
|
||||
if(status == LIGHT_OK || status == LIGHT_BURNED)
|
||||
src.visible_message("<span class='danger'>[name] shatters.</span>","<span class='italics'>You hear a small glass object shatter.</span>")
|
||||
visible_message("<span class='danger'>[name] shatters.</span>","<span class='italics'>You hear a small glass object shatter.</span>")
|
||||
status = LIGHT_BROKEN
|
||||
force = 5
|
||||
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = 0
|
||||
if(buckled_mob.client)
|
||||
buckled_mob.client.change_view(world.view)
|
||||
buckled_mob.client.change_view(CONFIG_GET(string/default_view))
|
||||
auto.Remove(buckled_mob)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -500,7 +500,7 @@
|
||||
user.client.pixel_x = world.icon_size*_x
|
||||
user.client.pixel_y = world.icon_size*_y
|
||||
else
|
||||
user.client.change_view(world.view)
|
||||
user.client.change_view(CONFIG_GET(string/default_view))
|
||||
user.client.pixel_x = 0
|
||||
user.client.pixel_y = 0
|
||||
return zoomed
|
||||
|
||||
@@ -223,7 +223,7 @@
|
||||
|
||||
/obj/item/gun/ballistic/automatic/ar
|
||||
name = "\improper NT-ARG 'Boarder'"
|
||||
desc = "A robust assault rile used by Nanotrasen fighting forces."
|
||||
desc = "A robust assault rifle used by Nanotrasen fighting forces."
|
||||
icon_state = "arg"
|
||||
item_state = "arg"
|
||||
slot_flags = 0
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
zoom_animating = 0
|
||||
animate(current_user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
|
||||
zoom_current_view_increase = 0
|
||||
current_user.client.change_view(world.view)
|
||||
current_user.client.change_view(CONFIG_GET(string/default_view))
|
||||
zooming_angle = 0
|
||||
current_zoom_x = 0
|
||||
current_zoom_y = 0
|
||||
@@ -358,8 +358,8 @@
|
||||
if(lastfire > world.time + delay)
|
||||
return
|
||||
lastfire = world.time
|
||||
. = ..()
|
||||
stop_aiming()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/beam_rifle/proc/sync_ammo()
|
||||
for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
|
||||
|
||||
@@ -59,6 +59,11 @@
|
||||
recharge()
|
||||
dispensable_reagents = sortList(dispensable_reagents)
|
||||
|
||||
/obj/machinery/chem_dispenser/Destroy()
|
||||
QDEL_NULL(beaker)
|
||||
QDEL_NULL(cell)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_dispenser/process()
|
||||
|
||||
if(recharged < 0)
|
||||
@@ -303,6 +308,7 @@
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_dispenser/drinks
|
||||
name = "soda dispenser"
|
||||
|
||||
@@ -13,6 +13,28 @@
|
||||
var/heater_coefficient = 0.1
|
||||
var/on = FALSE
|
||||
|
||||
/obj/machinery/chem_heater/Destroy()
|
||||
QDEL_NULL(beaker)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_heater/handle_atom_del(atom/A)
|
||||
. = ..()
|
||||
if(A == beaker)
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/chem_heater/update_icon()
|
||||
if(beaker)
|
||||
icon_state = "mixer1b"
|
||||
else
|
||||
icon_state = "mixer0b"
|
||||
|
||||
/obj/machinery/chem_heater/proc/eject_beaker()
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/chem_heater/RefreshParts()
|
||||
heater_coefficient = 0.1
|
||||
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
|
||||
@@ -52,12 +74,13 @@
|
||||
return
|
||||
beaker = I
|
||||
to_chat(user, "<span class='notice'>You add [I] to [src].</span>")
|
||||
icon_state = "mixer1b"
|
||||
update_icon()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_heater/on_deconstruction()
|
||||
eject_beaker()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
@@ -108,10 +131,3 @@
|
||||
on = FALSE
|
||||
eject_beaker()
|
||||
. = TRUE
|
||||
|
||||
/obj/machinery/chem_heater/proc/eject_beaker()
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
beaker.reagents.handle_reactions()
|
||||
beaker = null
|
||||
icon_state = "mixer0b"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/obj/item/reagent_containers/beaker = null
|
||||
var/obj/item/storage/pill_bottle/bottle = null
|
||||
var/mode = 1
|
||||
var/condi = 0
|
||||
var/condi = FALSE
|
||||
var/screen = "home"
|
||||
var/analyzeVars[0]
|
||||
var/useramount = 30 // Last used amount
|
||||
@@ -23,6 +23,11 @@
|
||||
add_overlay("waitlight")
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/chem_master/Destroy()
|
||||
QDEL_NULL(beaker)
|
||||
QDEL_NULL(bottle)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_master/RefreshParts()
|
||||
reagents.maximum_volume = 0
|
||||
for(var/obj/item/reagent_containers/glass/beaker/B in component_parts)
|
||||
@@ -44,10 +49,22 @@
|
||||
if(A == beaker)
|
||||
beaker = null
|
||||
reagents.clear_reagents()
|
||||
icon_state = "mixer0"
|
||||
update_icon()
|
||||
else if(A == bottle)
|
||||
bottle = null
|
||||
|
||||
/obj/machinery/chem_master/update_icon()
|
||||
if(beaker)
|
||||
icon_state = "mixer1"
|
||||
else
|
||||
icon_state = "mixer0"
|
||||
|
||||
/obj/machinery/chem_master/proc/eject_beaker()
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
adjust_item_drop_location(beaker)
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/chem_master/blob_act(obj/structure/blob/B)
|
||||
if (prob(50))
|
||||
@@ -61,15 +78,6 @@
|
||||
|
||||
/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
adjust_item_drop_location(beaker)
|
||||
beaker = null
|
||||
reagents.clear_reagents()
|
||||
if(bottle)
|
||||
bottle.forceMove(drop_location())
|
||||
adjust_item_drop_location(bottle)
|
||||
bottle = null
|
||||
return
|
||||
|
||||
else if(exchange_parts(user, I))
|
||||
@@ -94,7 +102,7 @@
|
||||
beaker = I
|
||||
to_chat(user, "<span class='notice'>You add [I] to [src].</span>")
|
||||
src.updateUsrDialog()
|
||||
icon_state = "mixer1"
|
||||
update_icon()
|
||||
|
||||
else if(!condi && istype(I, /obj/item/storage/pill_bottle))
|
||||
if(bottle)
|
||||
@@ -109,6 +117,13 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_master/on_deconstruction()
|
||||
eject_beaker()
|
||||
if(bottle)
|
||||
bottle.forceMove(drop_location())
|
||||
adjust_item_drop_location(bottle)
|
||||
bottle = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
@@ -154,13 +169,8 @@
|
||||
return
|
||||
switch(action)
|
||||
if("eject")
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
adjust_item_drop_location(beaker)
|
||||
beaker = null
|
||||
reagents.clear_reagents()
|
||||
icon_state = "mixer0"
|
||||
. = TRUE
|
||||
eject_beaker()
|
||||
. = TRUE
|
||||
|
||||
if("ejectp")
|
||||
if(bottle)
|
||||
@@ -348,7 +358,7 @@
|
||||
#if DM_VERSION >= 513
|
||||
#warning 512 is definitely stable now, remove the old code
|
||||
#endif
|
||||
|
||||
|
||||
#if DM_VERSION >= 512
|
||||
. += hex2num(md5[i])
|
||||
#else
|
||||
@@ -361,4 +371,4 @@
|
||||
/obj/machinery/chem_master/condimaster
|
||||
name = "CondiMaster 3000"
|
||||
desc = "Used to create condiments and other cooking supplies."
|
||||
condi = 1
|
||||
condi = TRUE
|
||||
|
||||
@@ -25,6 +25,12 @@
|
||||
QDEL_NULL(beaker)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/pandemic/handle_atom_del(atom/A)
|
||||
. = ..()
|
||||
if(A == beaker)
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/pandemic/proc/get_by_index(thing, index)
|
||||
if(!beaker || !beaker.reagents)
|
||||
return
|
||||
@@ -121,9 +127,10 @@
|
||||
add_overlay("waitlight")
|
||||
|
||||
/obj/machinery/computer/pandemic/proc/eject_beaker()
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
update_icon()
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, datum/tgui/master_ui, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
@@ -159,8 +166,7 @@
|
||||
return
|
||||
switch(action)
|
||||
if("eject_beaker")
|
||||
if(beaker)
|
||||
eject_beaker()
|
||||
eject_beaker()
|
||||
. = TRUE
|
||||
if("empty_beaker")
|
||||
if(beaker)
|
||||
@@ -236,7 +242,5 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/pandemic/on_deconstruction()
|
||||
if(beaker)
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
eject_beaker()
|
||||
. = ..()
|
||||
|
||||
@@ -109,7 +109,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
boozepwr = 45
|
||||
glass_icon_state = "kahluaglass"
|
||||
glass_name = "glass of RR Coffee Liquor"
|
||||
glass_name = "glass of RR coffee liquor"
|
||||
glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
|
||||
shot_glass_icon_state = "shotglasscream"
|
||||
|
||||
@@ -341,7 +341,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 25
|
||||
taste_description = "burning cinnamon"
|
||||
glass_icon_state = "goldschlagerglass"
|
||||
glass_name = "glass of Goldschlager"
|
||||
glass_name = "glass of goldschlager"
|
||||
glass_desc = "100% proof that teen girls will drink anything with gold in it."
|
||||
shot_glass_icon_state = "shotglassgold"
|
||||
|
||||
@@ -396,7 +396,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 70
|
||||
taste_description = "cola"
|
||||
glass_icon_state = "whiskeycolaglass"
|
||||
glass_name = "Whiskey Cola"
|
||||
glass_name = "whiskey cola"
|
||||
glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
|
||||
|
||||
/datum/reagent/consumable/ethanol/martini
|
||||
@@ -706,7 +706,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 70
|
||||
taste_description = "soda"
|
||||
glass_icon_state = "whiskeysodaglass2"
|
||||
glass_name = "Whiskey Soda"
|
||||
glass_name = "whiskey soda"
|
||||
glass_desc = "Ultimate refreshment."
|
||||
|
||||
/datum/reagent/consumable/ethanol/antifreeze
|
||||
@@ -785,7 +785,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 70
|
||||
taste_description = "tart bitterness"
|
||||
glass_icon_state = "vodkatonicglass"
|
||||
glass_name = "Vodka and Tonic"
|
||||
glass_name = "vodka and tonic"
|
||||
glass_desc = "For when a gin and tonic isn't Russian enough."
|
||||
|
||||
|
||||
@@ -797,7 +797,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 45
|
||||
taste_description = "dry, tart lemons"
|
||||
glass_icon_state = "ginfizzglass"
|
||||
glass_name = "Gin Fizz"
|
||||
glass_name = "gin fizz"
|
||||
glass_desc = "Refreshingly lemony, deliciously dry."
|
||||
|
||||
|
||||
@@ -870,7 +870,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 15
|
||||
taste_description = "refreshingly cold"
|
||||
glass_icon_state = "iced_beerglass"
|
||||
glass_name = "Iced Beer"
|
||||
glass_name = "iced beer"
|
||||
glass_desc = "A beer so frosty, the air around it freezes."
|
||||
|
||||
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M)
|
||||
@@ -1069,7 +1069,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 35
|
||||
taste_description = "sour lemons"
|
||||
glass_icon_state = "whiskey_sour"
|
||||
glass_name = "Whiskey Sour"
|
||||
glass_name = "whiskey sour"
|
||||
glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hcider
|
||||
@@ -1081,7 +1081,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 25
|
||||
taste_description = "apples"
|
||||
glass_icon_state = "whiskeyglass"
|
||||
glass_name = "Hard Cider"
|
||||
glass_name = "hard cider"
|
||||
glass_desc = "Tastes like autumn."
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
|
||||
@@ -1279,5 +1279,5 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
boozepwr = 1
|
||||
taste_description = "custard and alcohol"
|
||||
glass_icon_state = "glass_yellow"
|
||||
glass_name = "Eggnog"
|
||||
glass_name = "eggnog"
|
||||
glass_desc = "For enjoying the most wonderful time of the year."
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
description = "Absolutely nothing."
|
||||
taste_description = "nothing"
|
||||
glass_icon_state = "nothing"
|
||||
glass_name = "Nothing"
|
||||
glass_name = "nothing"
|
||||
glass_desc = "Absolutely nothing."
|
||||
shot_glass_icon_state = "shotglass"
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
nutriment_factor = 0
|
||||
taste_description = "bitter coldness"
|
||||
glass_icon_state = "icedcoffeeglass"
|
||||
glass_name = "Iced Coffee"
|
||||
glass_name = "iced coffee"
|
||||
glass_desc = "A drink to perk you up and refresh you!"
|
||||
|
||||
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/M)
|
||||
@@ -340,7 +340,7 @@
|
||||
nutriment_factor = 0
|
||||
taste_description = "sweet tea"
|
||||
glass_icon_state = "icedteaglass"
|
||||
glass_name = "Iced Tea"
|
||||
glass_name = "iced tea"
|
||||
glass_desc = "All natural, antioxidant-rich flavour sensation."
|
||||
|
||||
/datum/reagent/consumable/icetea/on_mob_life(mob/living/M)
|
||||
@@ -361,7 +361,7 @@
|
||||
color = "#100800" // rgb: 16, 8, 0
|
||||
taste_description = "cola"
|
||||
glass_icon_state = "glass_brown"
|
||||
glass_name = "glass of space Cola"
|
||||
glass_name = "glass of Space Cola"
|
||||
glass_desc = "A glass of refreshing Space Cola."
|
||||
|
||||
/datum/reagent/consumable/space_cola/on_mob_life(mob/living/M)
|
||||
@@ -377,7 +377,7 @@
|
||||
color = "#100800" // rgb: 16, 8, 0
|
||||
taste_description = "the future"
|
||||
glass_icon_state = "nuka_colaglass"
|
||||
glass_name = "Nuka Cola"
|
||||
glass_name = "glass of Nuka Cola"
|
||||
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/M)
|
||||
@@ -434,7 +434,7 @@
|
||||
color = "#00FF00" // rgb: 0, 255, 0
|
||||
taste_description = "cherry soda"
|
||||
glass_icon_state = "space-up_glass"
|
||||
glass_name = "glass of Space-up"
|
||||
glass_name = "glass of Space-Up"
|
||||
glass_desc = "Space-up. It helps you keep your cool."
|
||||
|
||||
|
||||
@@ -450,7 +450,7 @@
|
||||
color = "#8CFF00" // rgb: 135, 255, 0
|
||||
taste_description = "tangy lime and lemon soda"
|
||||
glass_icon_state = "glass_yellow"
|
||||
glass_name = "glass of Lemon-Lime"
|
||||
glass_name = "glass of lemon-lime"
|
||||
glass_desc = "You're pretty certain a real fruit has never actually touched this."
|
||||
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
color = "#f00060" // rgb: 94, 0, 38
|
||||
taste_description = "carbonated metallic soda"
|
||||
glass_icon_state = "glass_red"
|
||||
glass_name = "glass of Shambler's Juice"
|
||||
glass_name = "glass of Shambler's juice"
|
||||
glass_desc = "Mmm mm, shambly."
|
||||
|
||||
/datum/reagent/consumable/shamblers/on_mob_life(mob/living/M)
|
||||
@@ -495,7 +495,7 @@
|
||||
color = "#619494" // rgb: 97, 148, 148
|
||||
taste_description = "carbonated water"
|
||||
glass_icon_state = "glass_clear"
|
||||
glass_name = "glass of Soda Water"
|
||||
glass_name = "glass of soda water"
|
||||
glass_desc = "Soda water. Why not make a scotch and soda?"
|
||||
|
||||
/datum/reagent/consumable/sodawater/on_mob_life(mob/living/M)
|
||||
@@ -512,7 +512,7 @@
|
||||
color = "#0064C8" // rgb: 0, 100, 200
|
||||
taste_description = "tart and fresh"
|
||||
glass_icon_state = "glass_clear"
|
||||
glass_name = "glass of Tonic Water"
|
||||
glass_name = "glass of tonic water"
|
||||
glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
|
||||
|
||||
/datum/reagent/consumable/tonic/on_mob_life(mob/living/M)
|
||||
@@ -546,7 +546,7 @@
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
taste_description = "creamy coffee"
|
||||
glass_icon_state = "soy_latte"
|
||||
glass_name = "Soy Latte"
|
||||
glass_name = "soy latte"
|
||||
glass_desc = "A nice and refreshing beverage while you're reading."
|
||||
|
||||
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/M)
|
||||
@@ -568,7 +568,7 @@
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
taste_description = "bitter cream"
|
||||
glass_icon_state = "cafe_latte"
|
||||
glass_name = "Cafe Latte"
|
||||
glass_name = "cafe latte"
|
||||
glass_desc = "A nice, strong and refreshing beverage while you're reading."
|
||||
|
||||
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/M)
|
||||
@@ -612,7 +612,7 @@
|
||||
nutriment_factor = 4 * REAGENTS_METABOLISM
|
||||
taste_description = "sweet chocolate"
|
||||
glass_icon_state = "chocolatepudding"
|
||||
glass_name = "Chocolate Pudding"
|
||||
glass_name = "chocolate pudding"
|
||||
glass_desc = "Tasty."
|
||||
|
||||
/datum/reagent/consumable/vanillapudding
|
||||
@@ -623,7 +623,7 @@
|
||||
nutriment_factor = 4 * REAGENTS_METABOLISM
|
||||
taste_description = "sweet vanilla"
|
||||
glass_icon_state = "vanillapudding"
|
||||
glass_name = "Vanilla Pudding"
|
||||
glass_name = "vanilla pudding"
|
||||
glass_desc = "Tasty."
|
||||
|
||||
/datum/reagent/consumable/cherryshake
|
||||
@@ -634,7 +634,7 @@
|
||||
nutriment_factor = 4 * REAGENTS_METABOLISM
|
||||
taste_description = "creamy cherry"
|
||||
glass_icon_state = "cherryshake"
|
||||
glass_name = "Cherry Shake"
|
||||
glass_name = "cherry shake"
|
||||
glass_desc = "A cherry flavored milkshake."
|
||||
|
||||
/datum/reagent/consumable/bluecherryshake
|
||||
@@ -645,7 +645,7 @@
|
||||
nutriment_factor = 4 * REAGENTS_METABOLISM
|
||||
taste_description = "creamy blue cherry"
|
||||
glass_icon_state = "bluecherryshake"
|
||||
glass_name = "Blue Cherry Shake"
|
||||
glass_name = "blue cherry shake"
|
||||
glass_desc = "An exotic blue milkshake."
|
||||
|
||||
/datum/reagent/consumable/pumpkin_latte
|
||||
@@ -656,7 +656,7 @@
|
||||
nutriment_factor = 3 * REAGENTS_METABOLISM
|
||||
taste_description = "creamy pumpkin"
|
||||
glass_icon_state = "pumpkin_latte"
|
||||
glass_name = "Pumpkin Latte"
|
||||
glass_name = "pumpkin latte"
|
||||
glass_desc = "A mix of coffee and pumpkin juice."
|
||||
|
||||
/datum/reagent/consumable/gibbfloats
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/crank/addiction_act_stage4(mob/living/M)
|
||||
M.adjustBrainLoss(5*REM)
|
||||
M.adjustBrainLoss(3*REM)
|
||||
M.adjustToxLoss(5*REM, 0)
|
||||
M.adjustBruteLoss(5*REM, 0)
|
||||
..()
|
||||
|
||||
@@ -628,7 +628,7 @@
|
||||
. = 1
|
||||
if(prob(20))
|
||||
M.losebreath += 4
|
||||
M.adjustBrainLoss(2*REM)
|
||||
M.adjustBrainLoss(2*REM, 150)
|
||||
M.adjustToxLoss(3*REM,0)
|
||||
M.adjustStaminaLoss(10*REM,0)
|
||||
M.blur_eyes(5)
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
M.confused = 0
|
||||
M.SetSleeping(0, 0)
|
||||
M.jitteriness = 0
|
||||
M.cure_all_traumas(TRUE, TRUE)
|
||||
for(var/thing in M.viruses)
|
||||
var/datum/disease/D = thing
|
||||
if(D.severity == VIRUS_SEVERITY_POSITIVE)
|
||||
@@ -792,7 +793,13 @@
|
||||
color = "#DCDCFF"
|
||||
|
||||
/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M)
|
||||
M.adjustBrainLoss(-3*REM)
|
||||
M.adjustBrainLoss(-2*REM)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL))
|
||||
C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL)
|
||||
if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD))
|
||||
C.cure_trauma_type(BRAIN_TRAUMA_MILD)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/mutadone
|
||||
@@ -1016,7 +1023,7 @@
|
||||
M.adjustFireLoss(-3 * REM, 0)
|
||||
M.adjustOxyLoss(-15 * REM, 0)
|
||||
M.adjustToxLoss(-3 * REM, 0)
|
||||
M.adjustBrainLoss(2 * REM) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
|
||||
M.adjustBrainLoss(2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
|
||||
M.adjustCloneLoss(-1 * REM, 0)
|
||||
M.adjustStaminaLoss(-30 * REM, 0)
|
||||
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
|
||||
@@ -1047,7 +1054,7 @@
|
||||
if (M.hallucination >= 5)
|
||||
M.hallucination -= 5
|
||||
if(prob(20))
|
||||
M.adjustBrainLoss(1*REM)
|
||||
M.adjustBrainLoss(1*REM, 50)
|
||||
M.adjustStaminaLoss(2.5*REM, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
taste_description = "water"
|
||||
var/cooling_temperature = 2
|
||||
glass_icon_state = "glass_clear"
|
||||
glass_name = "glass of Water"
|
||||
glass_name = "glass of water"
|
||||
glass_desc = "The father of all refreshments."
|
||||
shot_glass_icon_state = "shotglassclear"
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
description = "Water blessed by some deity."
|
||||
color = "#E0E8EF" // rgb: 224, 232, 239
|
||||
glass_icon_state = "glass_clear"
|
||||
glass_name = "glass of Holy Water"
|
||||
glass_name = "glass of holy water"
|
||||
glass_desc = "A glass of holy water."
|
||||
|
||||
/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
@@ -261,7 +261,7 @@
|
||||
M.adjustBruteLoss(-2, 0)
|
||||
M.adjustFireLoss(-2, 0)
|
||||
else
|
||||
M.adjustBrainLoss(3)
|
||||
M.adjustBrainLoss(3, 150)
|
||||
M.adjustToxLoss(1, 0)
|
||||
M.adjustFireLoss(2, 0)
|
||||
M.adjustOxyLoss(2, 0)
|
||||
@@ -280,7 +280,7 @@
|
||||
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
|
||||
M.adjustToxLoss(1, 0)
|
||||
M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard?
|
||||
M.adjustBrainLoss(5)
|
||||
M.adjustBrainLoss(5, 150)
|
||||
holder.remove_reagent(src.id, 1)
|
||||
|
||||
/datum/reagent/medicine/omnizine/godblood
|
||||
@@ -676,7 +676,7 @@
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(5))
|
||||
M.emote(pick("twitch","drool","moan"))
|
||||
M.adjustBrainLoss(2)
|
||||
M.adjustBrainLoss(1)
|
||||
..()
|
||||
|
||||
/datum/reagent/sulfur
|
||||
@@ -1029,7 +1029,7 @@
|
||||
/datum/reagent/impedrezene/on_mob_life(mob/living/M)
|
||||
M.jitteriness = max(M.jitteriness-5,0)
|
||||
if(prob(80))
|
||||
M.adjustBrainLoss(1*REM)
|
||||
M.adjustBrainLoss(2*REM)
|
||||
if(prob(50))
|
||||
M.drowsyness = max(M.drowsyness, 3)
|
||||
if(prob(10))
|
||||
|
||||
@@ -455,13 +455,12 @@
|
||||
toxpwr = 0
|
||||
|
||||
/datum/reagent/toxin/neurotoxin2/on_mob_life(mob/living/M)
|
||||
if(M.brainloss + M.toxloss <= 60)
|
||||
M.adjustBrainLoss(1*REM)
|
||||
M.adjustBrainLoss(3*REM, 150)
|
||||
. = 1
|
||||
if(M.toxloss <= 60)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
. = 1
|
||||
if(current_cycle >= 18)
|
||||
M.Sleeping(40, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/cyanide
|
||||
|
||||
@@ -139,7 +139,6 @@
|
||||
/datum/chemical_reaction/reagent_explosion/methsplosion
|
||||
name = "Meth explosion"
|
||||
id = "methboom1"
|
||||
results = list("methboom1" = 1)
|
||||
required_temp = 380 //slightly above the meth mix time.
|
||||
required_reagents = list("methamphetamine" = 1)
|
||||
strengthdiv = 6
|
||||
@@ -154,9 +153,9 @@
|
||||
..()
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/methsplosion/methboom2
|
||||
id = "methboom2"
|
||||
required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine.
|
||||
required_temp = 300 //room temperature, chilling it even a little will prevent the explosion
|
||||
results = list("methboom1" = 4) // this is ugly. Sorry goof.
|
||||
required_temp = 300 //room temperature, chilling it even a little will prevent the explosion
|
||||
|
||||
/datum/chemical_reaction/sorium
|
||||
name = "Sorium"
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
if(51 to INFINITY)
|
||||
icon_state = "full"
|
||||
|
||||
/obj/item/reagent_containers/blood/random
|
||||
icon_state = "random_bloodpack"
|
||||
|
||||
/obj/item/reagent_containers/blood/random/Initialize()
|
||||
blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L")
|
||||
. = ..()
|
||||
|
||||
@@ -30,7 +30,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/r_n_d/circuit_imprinter/Initialize()
|
||||
materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE),
|
||||
materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), 0,
|
||||
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
materials.precise_insertion = TRUE
|
||||
create_reagents(0)
|
||||
|
||||
@@ -800,6 +800,13 @@
|
||||
build_path = /obj/item/device/slime_scanner
|
||||
category = list("initial", "Misc")
|
||||
|
||||
/datum/design/pet_carrier
|
||||
name = "Pet Carrier"
|
||||
id = "pet_carrier"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
|
||||
build_path = /obj/item/pet_carrier
|
||||
|
||||
/datum/design/miniature_power_cell
|
||||
name = "Light Fixture Battery"
|
||||
id = "miniature_power_cell"
|
||||
|
||||
@@ -30,11 +30,13 @@ Note: Must be placed west/left of and R&D console to function.
|
||||
"Computer Parts"
|
||||
)
|
||||
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
|
||||
/obj/machinery/r_n_d/protolathe/Initialize()
|
||||
create_reagents(0)
|
||||
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
|
||||
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),
|
||||
materials = AddComponent(/datum/component/material_container,
|
||||
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
|
||||
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
materials.precise_insertion = TRUE
|
||||
return ..()
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
|
||||
var/area/new_area = get_area(t)
|
||||
if(new_area && new_area.name == allowed_area || istype(new_area, /area/science/xenobiology ))
|
||||
if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible)
|
||||
return ..()
|
||||
else
|
||||
return
|
||||
|
||||
@@ -508,14 +508,14 @@
|
||||
|
||||
/obj/item/areaeditor/blueprints/slime
|
||||
name = "cerulean prints"
|
||||
desc = "A one use yet of blueprints made of jelly like organic material. Renaming an area to 'Xenobiology Lab' will extend the reach of the management console."
|
||||
desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console."
|
||||
color = "#2956B2"
|
||||
|
||||
/obj/item/areaeditor/blueprints/slime/edit_area()
|
||||
var/success = ..()
|
||||
..()
|
||||
var/area/A = get_area(src)
|
||||
if(success)
|
||||
for(var/turf/T in A)
|
||||
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY)
|
||||
qdel(src)
|
||||
for(var/turf/T in A)
|
||||
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY)
|
||||
A.xenobiology_compatible = TRUE
|
||||
qdel(src)
|
||||
|
||||
@@ -14,6 +14,17 @@
|
||||
var/x_offset = 0
|
||||
var/y_offset = 0
|
||||
var/space_turfs_only = TRUE
|
||||
var/see_hidden = FALSE
|
||||
var/designate_time = 0
|
||||
var/turf/designating_target_loc
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize()
|
||||
. = ..()
|
||||
GLOB.navigation_computers += src
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/Destroy()
|
||||
. = ..()
|
||||
GLOB.navigation_computers -= src
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/GrantActions(mob/living/user)
|
||||
if(jumpto_ports.len)
|
||||
@@ -59,51 +70,87 @@
|
||||
..()
|
||||
if(!QDELETED(user) && user.client)
|
||||
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
|
||||
user.client.images += the_eye.placement_images
|
||||
user.client.images += the_eye.placed_images
|
||||
var/list/to_add = list()
|
||||
to_add += the_eye.placement_images
|
||||
to_add += the_eye.placed_images
|
||||
if(!see_hidden)
|
||||
to_add += SSshuttle.hidden_shuttle_turf_images
|
||||
|
||||
user.client.images += to_add
|
||||
user.client.change_view(view_range)
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/remove_eye_control(mob/living/user)
|
||||
..()
|
||||
if(!QDELETED(user) && user.client)
|
||||
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
|
||||
user.client.images -= the_eye.placement_images
|
||||
user.client.images -= the_eye.placed_images
|
||||
user.client.change_view(world.view)
|
||||
var/list/to_remove = list()
|
||||
to_remove += the_eye.placement_images
|
||||
to_remove += the_eye.placed_images
|
||||
if(!see_hidden)
|
||||
to_remove += SSshuttle.hidden_shuttle_turf_images
|
||||
|
||||
user.client.images -= to_remove
|
||||
user.client.change_view(CONFIG_GET(string/default_view))
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/placeLandingSpot()
|
||||
if(!checkLandingSpot())
|
||||
return FALSE
|
||||
if(designating_target_loc || !current_user)
|
||||
return
|
||||
|
||||
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
|
||||
var/landing_clear = checkLandingSpot()
|
||||
if(designate_time && (landing_clear != SHUTTLE_DOCKER_BLOCKED))
|
||||
to_chat(current_user, "<span class='warning'>Targeting transit location, please wait [designate_time/10] seconds...</span>")
|
||||
designating_target_loc = the_eye.loc
|
||||
var/wait_completed = do_after(current_user, designate_time, FALSE, designating_target_loc, TRUE, CALLBACK(src, /obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget))
|
||||
designating_target_loc = null
|
||||
if(!current_user)
|
||||
return
|
||||
if(!wait_completed)
|
||||
to_chat(current_user, "<span class='warning'>Operation aborted.</span>")
|
||||
return
|
||||
landing_clear = checkLandingSpot()
|
||||
|
||||
if(landing_clear != SHUTTLE_DOCKER_LANDING_CLEAR)
|
||||
switch(landing_clear)
|
||||
if(SHUTTLE_DOCKER_BLOCKED)
|
||||
to_chat(current_user, "<span class='warning'>Invalid transit location</span>")
|
||||
if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT)
|
||||
to_chat(current_user, "<span class='warning'>Unknown object detected in landing zone. Please designate another location.</span>")
|
||||
return
|
||||
|
||||
if(!my_port)
|
||||
my_port = new /obj/docking_port/stationary()
|
||||
my_port.name = shuttlePortName
|
||||
my_port.id = shuttlePortId
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
my_port.height = M.height
|
||||
my_port.width = M.width
|
||||
my_port.dheight = M.dheight
|
||||
my_port.dwidth = M.dwidth
|
||||
my_port.height = shuttle_port.height
|
||||
my_port.width = shuttle_port.width
|
||||
my_port.dheight = shuttle_port.dheight
|
||||
my_port.dwidth = shuttle_port.dwidth
|
||||
my_port.hidden = shuttle_port.hidden
|
||||
my_port.dir = the_eye.dir
|
||||
my_port.loc = locate(eyeobj.x - x_offset, eyeobj.y - y_offset, eyeobj.z)
|
||||
if(current_user && current_user.client)
|
||||
if(current_user.client)
|
||||
current_user.client.images -= the_eye.placed_images
|
||||
|
||||
for(var/V in the_eye.placed_images)
|
||||
qdel(V)
|
||||
the_eye.placed_images = list()
|
||||
QDEL_LIST(the_eye.placed_images)
|
||||
|
||||
for(var/V in the_eye.placement_images)
|
||||
var/image/I = V
|
||||
var/image/newI = image('icons/effects/alphacolors.dmi', the_eye.loc, "blue")
|
||||
newI.loc = I.loc //It is highly unlikely that any landing spot including a null tile will get this far, but better safe than sorry
|
||||
newI.loc = I.loc //It is highly unlikely that any landing spot including a null tile will get this far, but better safe than sorry.
|
||||
newI.layer = ABOVE_OPEN_TURF_LAYER
|
||||
newI.plane = 0
|
||||
newI.mouse_opacity = 0
|
||||
the_eye.placed_images += newI
|
||||
|
||||
if(current_user && current_user.client)
|
||||
if(current_user.client)
|
||||
current_user.client.images += the_eye.placed_images
|
||||
to_chat(current_user, "<span class='notice'>Transit location designated</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget()
|
||||
if(!designating_target_loc || !current_user || (eyeobj.loc != designating_target_loc) || (stat & (NOPOWER|BROKEN)) )
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/rotateLandingSpot()
|
||||
@@ -127,41 +174,65 @@
|
||||
var/turf/eyeturf = get_turf(the_eye)
|
||||
if(!eyeturf)
|
||||
return
|
||||
. = SHUTTLE_DOCKER_LANDING_CLEAR
|
||||
var/list/bounds = shuttle_port.return_coords(the_eye.x - x_offset, the_eye.y - y_offset, the_eye.dir)
|
||||
var/list/overlappers = SSshuttle.get_dock_overlap(bounds[1], bounds[2], bounds[3], bounds[4], the_eye.z)
|
||||
. = TRUE
|
||||
var/list/image_cache = the_eye.placement_images
|
||||
for(var/i in 1 to image_cache.len)
|
||||
var/image/I = image_cache[i]
|
||||
var/list/coords = image_cache[I]
|
||||
var/turf/T = locate(eyeturf.x + coords[1], eyeturf.y + coords[2], eyeturf.z)
|
||||
I.loc = T
|
||||
if(checkLandingTurf(T, overlappers))
|
||||
I.icon_state = "green"
|
||||
else
|
||||
I.icon_state = "red"
|
||||
. = FALSE
|
||||
switch(checkLandingTurf(T, overlappers))
|
||||
if(SHUTTLE_DOCKER_LANDING_CLEAR)
|
||||
I.icon_state = "green"
|
||||
if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT)
|
||||
I.icon_state = "green"
|
||||
if(. == SHUTTLE_DOCKER_LANDING_CLEAR)
|
||||
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
|
||||
else
|
||||
I.icon_state = "red"
|
||||
. = SHUTTLE_DOCKER_BLOCKED
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingTurf(turf/T, list/overlappers)
|
||||
// Too close to the map edge is never allowed
|
||||
if(!T || T.x == 1 || T.y == 1 || T.x == world.maxx || T.y == world.maxy)
|
||||
return FALSE
|
||||
return SHUTTLE_DOCKER_BLOCKED
|
||||
// If it's one of our shuttle areas assume it's ok to be there
|
||||
if(shuttle_port.shuttle_areas[T.loc])
|
||||
return TRUE
|
||||
return SHUTTLE_DOCKER_LANDING_CLEAR
|
||||
. = SHUTTLE_DOCKER_LANDING_CLEAR
|
||||
// See if the turf is hidden from us
|
||||
var/list/hidden_turf_info
|
||||
if(!see_hidden)
|
||||
hidden_turf_info = SSshuttle.hidden_shuttle_turfs[T]
|
||||
if(hidden_turf_info)
|
||||
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
|
||||
|
||||
if(space_turfs_only)
|
||||
var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type
|
||||
if(!ispath(turf_type, /turf/open/space))
|
||||
return SHUTTLE_DOCKER_BLOCKED
|
||||
|
||||
// Checking for overlapping dock boundaries
|
||||
for(var/i in 1 to overlappers.len)
|
||||
var/obj/docking_port/port = overlappers[i]
|
||||
if(port == my_port)
|
||||
continue
|
||||
var/port_hidden = !see_hidden && port.hidden
|
||||
var/list/overlap = overlappers[port]
|
||||
var/list/xs = overlap[1]
|
||||
var/list/ys = overlap[2]
|
||||
if(xs["[T.x]"] && ys["[T.y]"])
|
||||
return FALSE
|
||||
if(space_turfs_only && !isspaceturf(T))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(port_hidden)
|
||||
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
|
||||
else
|
||||
return SHUTTLE_DOCKER_BLOCKED
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/update_hidden_docking_ports(list/remove_images, list/add_images)
|
||||
if(!see_hidden && current_user && current_user.client)
|
||||
current_user.client.images -= remove_images
|
||||
current_user.client.images += add_images
|
||||
|
||||
/mob/camera/aiEye/remote/shuttle_docker
|
||||
visible_icon = FALSE
|
||||
@@ -204,10 +275,7 @@
|
||||
var/mob/living/C = target
|
||||
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
|
||||
var/obj/machinery/computer/camera_advanced/shuttle_docker/origin = remote_eye.origin
|
||||
if(origin.placeLandingSpot())
|
||||
to_chat(target, "<span class='notice'>Transit location designated</span>")
|
||||
else
|
||||
to_chat(target, "<span class='warning'>Invalid transit location</span>")
|
||||
origin.placeLandingSpot(target)
|
||||
|
||||
/datum/action/innate/camera_jump/shuttle_docker
|
||||
name = "Jump to Location"
|
||||
|
||||
@@ -92,7 +92,7 @@ All ShuttleMove procs go here
|
||||
return TRUE
|
||||
|
||||
// Called on atoms after everything has been moved
|
||||
/atom/movable/proc/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/atom/movable/proc/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
if(light)
|
||||
update_light()
|
||||
if(rotation)
|
||||
@@ -148,7 +148,7 @@ All ShuttleMove procs go here
|
||||
A.air_tight = TRUE
|
||||
INVOKE_ASYNC(A, /obj/machinery/door/.proc/close)
|
||||
|
||||
/obj/machinery/door/airlock/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
shuttledocked = 1
|
||||
for(var/obj/machinery/door/airlock/A in range(1, src))
|
||||
@@ -160,24 +160,24 @@ All ShuttleMove procs go here
|
||||
. |= MOVE_CONTENTS
|
||||
GLOB.cameranet.removeCamera(src)
|
||||
|
||||
/obj/machinery/camera/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/camera/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
GLOB.cameranet.addCamera(src)
|
||||
|
||||
/obj/machinery/telecomms/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/telecomms/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
listening_level = z // Update listening Z, just in case you have telecomm relay on a shuttle
|
||||
|
||||
/obj/machinery/mech_bay_recharge_port/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
|
||||
/obj/machinery/mech_bay_recharge_port/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
|
||||
. = ..()
|
||||
recharging_turf = get_step(loc, dir)
|
||||
|
||||
/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
if(pipe_vision_img)
|
||||
pipe_vision_img.loc = loc
|
||||
|
||||
/obj/machinery/computer/auxillary_base/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/computer/auxillary_base/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery
|
||||
SSblackbox.record_feedback("associative", "colonies_dropped", 1, list("x" = x, "y" = y, "z" = z))
|
||||
@@ -187,7 +187,7 @@ All ShuttleMove procs go here
|
||||
on = FALSE
|
||||
update_list()
|
||||
|
||||
/obj/machinery/gravity_generator/main/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/gravity_generator/main/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
if(charge_count != 0 && charging_state != POWER_UP)
|
||||
on = TRUE
|
||||
@@ -198,7 +198,7 @@ All ShuttleMove procs go here
|
||||
if(. & MOVE_AREA)
|
||||
. |= MOVE_CONTENTS
|
||||
|
||||
/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
var/missing_nodes = FALSE
|
||||
for(DEVICE_TYPE_LOOP)
|
||||
@@ -227,7 +227,7 @@ All ShuttleMove procs go here
|
||||
// atmosinit() calls update_icon(), so we don't need to call it
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/atmospherics/pipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
@@ -237,7 +237,7 @@ All ShuttleMove procs go here
|
||||
GLOB.navbeacons["[z]"] -= src
|
||||
GLOB.deliverybeacons -= src
|
||||
|
||||
/obj/machinery/navbeacon/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/navbeacon/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
@@ -249,7 +249,7 @@ All ShuttleMove procs go here
|
||||
GLOB.deliverybeacons += src
|
||||
GLOB.deliverybeacontags += location
|
||||
|
||||
/obj/machinery/power/terminal/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/machinery/power/terminal/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
var/turf/T = src.loc
|
||||
if(level==1)
|
||||
@@ -257,7 +257,7 @@ All ShuttleMove procs go here
|
||||
|
||||
/************************************Item move procs************************************/
|
||||
|
||||
/obj/item/storage/pod/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/item/storage/pod/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
unlocked = TRUE
|
||||
// If the pod was launched, the storage will always open.
|
||||
@@ -269,7 +269,7 @@ All ShuttleMove procs go here
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/mob/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/mob/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
if(!move_on_shuttle)
|
||||
return
|
||||
. = ..()
|
||||
@@ -279,7 +279,7 @@ All ShuttleMove procs go here
|
||||
shake_force *= 0.25
|
||||
shake_camera(src, shake_force, 1)
|
||||
|
||||
/mob/living/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/mob/living/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
if(movement_force && !buckled)
|
||||
if(movement_force["THROW"])
|
||||
@@ -307,11 +307,11 @@ All ShuttleMove procs go here
|
||||
if(. & MOVE_AREA)
|
||||
. |= MOVE_CONTENTS
|
||||
|
||||
/obj/structure/disposalpipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/structure/disposalpipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
update()
|
||||
|
||||
/obj/structure/cable/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
/obj/structure/cable/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
if(level==1)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
var/area_type
|
||||
var/turf_type
|
||||
var/baseturf_type
|
||||
var/hidden = FALSE //are we invisible to shuttle navigation computers?
|
||||
|
||||
//these objects are indestructible
|
||||
/obj/docking_port/Destroy(force)
|
||||
@@ -304,6 +305,7 @@
|
||||
var/current_engines = 0 //current engine power
|
||||
var/initial_engines = 0 //initial engine power
|
||||
var/can_move_docking_ports = FALSE //if this shuttle can move docking ports other than the one it is docked at
|
||||
var/list/hidden_turfs = list()
|
||||
|
||||
/obj/docking_port/mobile/proc/register()
|
||||
SSshuttle.mobile += src
|
||||
@@ -539,7 +541,7 @@
|
||||
|
||||
// The baseturf that the gets assigned to the turf_type above
|
||||
var/underlying_baseturf_type = /turf/open/space
|
||||
|
||||
|
||||
// The area that gets placed under where the shuttle moved from
|
||||
var/underlying_area_type = /area/space
|
||||
|
||||
@@ -591,7 +593,7 @@
|
||||
CHECK_TICK
|
||||
|
||||
/****************************************All beforeShuttleMove procs*****************************************/
|
||||
|
||||
|
||||
for(var/i in 1 to old_turfs.len)
|
||||
CHECK_TICK
|
||||
var/turf/oldT = old_turfs[i]
|
||||
@@ -619,6 +621,17 @@
|
||||
|
||||
old_turfs[oldT] = move_mode
|
||||
|
||||
/*******************************************Hiding turfs if necessary******************************************/
|
||||
|
||||
var/list/new_hidden_turfs
|
||||
if(hidden)
|
||||
new_hidden_turfs = list()
|
||||
for(var/i in 1 to old_turfs.len)
|
||||
var/turf/oldT = old_turfs[i]
|
||||
if(old_turfs[oldT] & MOVE_TURF)
|
||||
new_hidden_turfs += new_turfs[i]
|
||||
SSshuttle.update_hidden_docking_ports(null, new_hidden_turfs)
|
||||
|
||||
/*******************************************All onShuttleMove procs******************************************/
|
||||
|
||||
for(var/i in 1 to old_turfs.len)
|
||||
@@ -631,11 +644,11 @@
|
||||
if(moving_atom.loc != oldT) //fix for multi-tile objects
|
||||
continue
|
||||
moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms
|
||||
moved_atoms += moving_atom
|
||||
|
||||
moved_atoms[moving_atom] = oldT
|
||||
|
||||
if(move_mode & MOVE_TURF)
|
||||
oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs
|
||||
|
||||
|
||||
if(move_mode & MOVE_AREA)
|
||||
var/area/shuttle_area = oldT.loc
|
||||
shuttle_area.onShuttleMove(oldT, newT, underlying_old_area) //areas
|
||||
@@ -665,7 +678,10 @@
|
||||
for(var/i in 1 to moved_atoms.len)
|
||||
CHECK_TICK
|
||||
var/atom/movable/moved_object = moved_atoms[i]
|
||||
moved_object.afterShuttleMove(movement_force, dir, preferred_direction, movement_direction, rotation)//atoms
|
||||
if(QDELETED(moved_object))
|
||||
continue
|
||||
var/turf/oldT = moved_atoms[moved_object]
|
||||
moved_object.afterShuttleMove(oldT, movement_force, dir, preferred_direction, movement_direction, rotation)//atoms
|
||||
|
||||
for(var/i in 1 to old_turfs.len)
|
||||
CHECK_TICK
|
||||
@@ -679,6 +695,12 @@
|
||||
newT.blocks_air = initial(newT.blocks_air)
|
||||
newT.air_update_turf(TRUE)
|
||||
|
||||
/*******************************************Unhiding turfs if necessary******************************************/
|
||||
|
||||
if(new_hidden_turfs)
|
||||
SSshuttle.update_hidden_docking_ports(hidden_turfs, null)
|
||||
hidden_turfs = new_hidden_turfs
|
||||
|
||||
check_poddoors()
|
||||
new_dock.last_dock_time = world.time
|
||||
setDir(new_dock.dir)
|
||||
|
||||
@@ -48,10 +48,6 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
|
||||
|
||||
/************************************Structure rotate procs************************************/
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation, params)
|
||||
. = ..()
|
||||
expected_dir = angle2dir(rotation+dir2angle(dir))
|
||||
|
||||
/obj/structure/cable/shuttleRotate(rotation, params)
|
||||
params &= ~ROTATE_DIR
|
||||
. = ..()
|
||||
@@ -105,10 +101,6 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
|
||||
params = NONE
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation, params)
|
||||
expected_dir = angle2dir(rotation+dir2angle(dir))
|
||||
return ..()
|
||||
|
||||
//prevents shuttles attempting to rotate this since it messes up sprites
|
||||
/obj/machinery/gravity_generator/shuttleRotate(rotation, params)
|
||||
params = NONE
|
||||
|
||||
@@ -58,5 +58,6 @@
|
||||
view_range = 13
|
||||
x_offset = -4
|
||||
y_offset = -2
|
||||
see_hidden = TRUE
|
||||
|
||||
#undef SYNDICATE_CHALLENGE_TIMER
|
||||
@@ -1,18 +1,19 @@
|
||||
/obj/machinery/computer/shuttle/white_ship
|
||||
name = "White Ship Console"
|
||||
desc = "Used to control the White Ship."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship
|
||||
shuttleId = "whiteship"
|
||||
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;whiteship_custom"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship
|
||||
name = "White Ship Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the White Ship."
|
||||
shuttleId = "whiteship"
|
||||
station_lock_override = TRUE
|
||||
shuttlePortId = "whiteship_custom"
|
||||
shuttlePortName = "Custom Location"
|
||||
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1)
|
||||
view_range = 20
|
||||
x_offset = -6
|
||||
y_offset = -10
|
||||
/obj/machinery/computer/shuttle/white_ship
|
||||
name = "White Ship Console"
|
||||
desc = "Used to control the White Ship."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship
|
||||
shuttleId = "whiteship"
|
||||
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;whiteship_custom"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship
|
||||
name = "White Ship Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the White Ship."
|
||||
shuttleId = "whiteship"
|
||||
station_lock_override = TRUE
|
||||
shuttlePortId = "whiteship_custom"
|
||||
shuttlePortName = "Custom Location"
|
||||
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1)
|
||||
view_range = 18
|
||||
x_offset = -6
|
||||
y_offset = -10
|
||||
designate_time = 100
|
||||
|
||||
@@ -31,9 +31,8 @@
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/voice_of_god/cast(list/targets, mob/user = usr)
|
||||
user.say(uppertext(command), spans = spans, sanitize = FALSE)
|
||||
playsound(get_turf(user), speech_sound, 300, 1, 5)
|
||||
var/cooldown = voice_of_god(command, user, spans, base_multiplier = power_mod)
|
||||
var/cooldown = voice_of_god(uppertext(command), user, spans, base_multiplier = power_mod)
|
||||
charge_max = (cooldown * cooldown_mod)
|
||||
|
||||
/obj/effect/proc_holder/spell/voice_of_god/clown
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/datum/surgery/brain_surgery
|
||||
name = "brain surgery"
|
||||
steps = list(
|
||||
/datum/surgery_step/incise,
|
||||
/datum/surgery_step/retract_skin,
|
||||
/datum/surgery_step/saw,
|
||||
/datum/surgery_step/clamp_bleeders,
|
||||
/datum/surgery_step/fix_brain,
|
||||
/datum/surgery_step/close)
|
||||
|
||||
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
possible_locs = list("head")
|
||||
requires_bodypart_type = 0
|
||||
|
||||
/datum/surgery_step/fix_brain
|
||||
name = "fix brain"
|
||||
implements = list(/obj/item/hemostat = 85, /obj/item/screwdriver = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100
|
||||
time = 120 //long and complicated
|
||||
|
||||
/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target)
|
||||
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(!B)
|
||||
to_chat(user, "<span class='warning'>It's hard to do surgery on someone's brain when they don't have one.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to fix [target]'s brain.", "<span class='notice'>You begin to fix [target]'s brain...</span>")
|
||||
|
||||
/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] successfully fixes [target]'s brain!", "<span class='notice'>You succeed in fixing [target]'s brain.</span>")
|
||||
target.adjustBrainLoss(-60)
|
||||
target.cure_all_traumas()
|
||||
return TRUE
|
||||
|
||||
/datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(target.getorganslot(ORGAN_SLOT_BRAIN))
|
||||
user.visible_message("<span class='warning'>[user] screws up, causing more damage!</span>", "<span class='warning'>You screw up, causing more damage!</span>")
|
||||
target.adjustBrainLoss(80)
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "<span class='warning'>You suddenly notice that the brain you were working on is not there anymore.</span>")
|
||||
return FALSE
|
||||
@@ -16,6 +16,7 @@
|
||||
if(!E)
|
||||
to_chat(user, "It's hard to do surgery on someone's eyes when they don't have any.")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to fix [target]'s eyes.", "<span class='notice'>You begin to fix [target]'s eyes...</span>")
|
||||
@@ -32,7 +33,7 @@
|
||||
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(target.getorgan(/obj/item/organ/brain))
|
||||
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain!</span>", "<span class='warning'>You accidentally stab [target] right in the brain!</span>")
|
||||
target.adjustBrainLoss(100)
|
||||
target.adjustBrainLoss(70)
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.</span>", "<span class='warning'>You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.</span>")
|
||||
return FALSE
|
||||
@@ -63,9 +63,13 @@
|
||||
H.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
beat = BEAT_NONE
|
||||
|
||||
if(H.jitteriness && H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW))
|
||||
H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT)
|
||||
beat = BEAT_FAST
|
||||
if(H.jitteriness)
|
||||
if(H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW))
|
||||
H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT)
|
||||
beat = BEAT_FAST
|
||||
else if(beat == BEAT_FAST)
|
||||
H.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
beat = BEAT_NONE
|
||||
|
||||
/obj/item/organ/heart/cursed
|
||||
name = "cursed heart"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user