Updates to master and makes gravity event code be current.

This commit is contained in:
Neerti
2020-03-26 04:10:51 -04:00
494 changed files with 6632 additions and 3210 deletions
@@ -2,17 +2,17 @@
name = "Jump a Shuttle"
/datum/admin_secret_item/admin_secret/jump_shuttle/can_execute(var/mob/user)
if(!shuttle_controller) return 0
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/jump_shuttle/execute(var/mob/user)
. = ..()
if(!.)
return
var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles
var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in SSshuttles.shuttles
if (!shuttle_tag) return
var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/origin_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
if (!origin_area) return
@@ -2,7 +2,7 @@
name = "Launch a Shuttle"
/datum/admin_secret_item/admin_secret/launch_shuttle/can_execute(var/mob/user)
if(!shuttle_controller) return 0
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/launch_shuttle/execute(var/mob/user)
@@ -10,15 +10,15 @@
if(!.)
return
var/list/valid_shuttles = list()
for (var/shuttle_tag in shuttle_controller.shuttles)
if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry))
for (var/shuttle_tag in SSshuttles.shuttles)
if (istype(SSshuttles.shuttles[shuttle_tag], /datum/shuttle/autodock))
valid_shuttles += shuttle_tag
var/shuttle_tag = input(user, "Which shuttle do you want to launch?") as null|anything in valid_shuttles
if (!shuttle_tag)
return
var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag]
var/datum/shuttle/autodock/S = SSshuttles.shuttles[shuttle_tag]
if (S.can_launch())
S.launch(user)
log_and_message_admins("launched the [shuttle_tag] shuttle", user)
@@ -2,7 +2,7 @@
name = "Launch a Shuttle (Forced)"
/datum/admin_secret_item/admin_secret/launch_shuttle_forced/can_execute(var/mob/user)
if(!shuttle_controller) return 0
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/launch_shuttle_forced/execute(var/mob/user)
@@ -10,15 +10,15 @@
if(!.)
return
var/list/valid_shuttles = list()
for (var/shuttle_tag in shuttle_controller.shuttles)
if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry))
for (var/shuttle_tag in SSshuttles.shuttles)
if (istype(SSshuttles.shuttles[shuttle_tag], /datum/shuttle/autodock))
valid_shuttles += shuttle_tag
var/shuttle_tag = input(user, "Which shuttle's launch do you want to force?") as null|anything in valid_shuttles
if (!shuttle_tag)
return
var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag]
var/datum/shuttle/autodock/S = SSshuttles.shuttles[shuttle_tag]
if (S.can_force())
S.force_launch(user)
log_and_message_admins("forced the [shuttle_tag] shuttle", user)
@@ -2,7 +2,7 @@
name = "Move a Shuttle"
/datum/admin_secret_item/admin_secret/move_shuttle/can_execute(var/mob/user)
if(!shuttle_controller) return 0
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/move_shuttle/execute(var/mob/user)
@@ -13,16 +13,15 @@
if (confirm == "Cancel")
return
var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles
var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in SSshuttles.shuttles
if (!shuttle_tag) return
var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/origin_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
if (!origin_area) return
var/destination_tag = input(user, "Which landmark do you want to jump to? (IF YOU GET THIS WRONG THINGS WILL BREAK)") as null|anything in SSshuttles.registered_shuttle_landmarks
if (!destination_tag) return
var/destination_location = SSshuttles.get_landmark(destination_tag)
if (!destination_location) return
var/destination_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
if (!destination_area) return
S.move(origin_area, destination_area)
S.attempt_move(destination_location)
log_and_message_admins("moved the [shuttle_tag] shuttle", user)
@@ -17,7 +17,7 @@
gravity_is_on = !gravity_is_on
for(var/area/A in all_areas)
A.gravitychange(gravity_is_on,A)
A.gravitychange(gravity_is_on)
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","Grav")
+1 -1
View File
@@ -539,7 +539,7 @@
Pump.air2.gas["nitrogen"] = 3750 //The contents of 2 canisters.
Pump.air2.temperature = 50
Pump.air2.update_values()
Pump.use_power=1
Pump.update_use_power(USE_POWER_IDLE)
Pump.target_pressure = 4500
Pump.update_icon()
+23
View File
@@ -0,0 +1,23 @@
//Merged Doohl's and the existing ticklag as they both had good elements about them ~
//Replaces the old Ticklag verb, fps is easier to understand
/client/proc/set_server_fps()
set category = "Debug"
set name = "Set Server FPS"
set desc = "Sets game speed in frames-per-second. Can potentially break the game"
if(!check_rights(R_DEBUG))
return
var/new_fps = round(input("Sets game frames-per-second. Can potentially break the game (default: [config.fps])", "FPS", world.fps) as num|null)
if(new_fps <= 0)
to_chat(src, "<span class='danger'>Error: set_server_fps(): Invalid world.fps value. No changes made.</span>")
return
if(new_fps > config.fps * 1.5)
if(alert(src, "You are setting fps to a high value:\n\t[new_fps] frames-per-second\n\tconfig.fps = [config.fps]", "Warning!", "Confirm", "ABORT-ABORT-ABORT") != "Confirm")
return
var/msg = "[key_name(src)] has modified world.fps to [new_fps]"
log_admin(msg, 0)
message_admins(msg, 0)
world.change_fps(new_fps)
feedback_add_details("admin_verb", "SETFPS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -139,7 +139,7 @@ var/list/debug_verbs = list (
,/client/proc/cmd_assume_direct_control
,/client/proc/jump_to_dead_group
,/client/proc/startSinglo
,/client/proc/ticklag
,/client/proc/set_server_fps
,/client/proc/cmd_admin_grantfullaccess
,/client/proc/kaboom
,/client/proc/cmd_admin_areatest
-24
View File
@@ -1,24 +0,0 @@
//Merged Doohl's and the existing ticklag as they both had good elements about them ~Carn
/client/proc/ticklag()
set category = "Debug"
set name = "Set Ticklag"
set desc = "Sets a new tick lag. Recommend you don't mess with this too much! Stable, time-tested ticklag value is 0.9"
if(!check_rights(R_DEBUG)) return
var/newtick = input("Sets a new tick lag. Please don't mess with this too much! The stable, time-tested ticklag value is 0.9","Lag of Tick", world.tick_lag) as num|null
//I've used ticks of 2 before to help with serious singulo lags
if(newtick && newtick <= 2 && newtick > 0)
log_admin("[key_name(src)] has modified world.tick_lag to [newtick]", 0)
message_admins("[key_name(src)] has modified world.tick_lag to [newtick]", 0)
world.tick_lag = newtick
feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Yes","No"))
if("Yes") config.Tickcomp = 1
else config.Tickcomp = 0
else
to_chat(src, "<font color='red'>Error: ticklag(): Invalid world.ticklag value. No changes made.</font>")
@@ -310,6 +310,13 @@ GLOBAL_PROTECT(VVpixelmovement)
if(!variable)
return
if(variable in GLOB.VVpixelmovement)
if(!check_rights(R_DEBUG))
return
var/prompt = alert(src, "Editing this var may irreparably break tile gliding for the rest of the round. THIS CAN'T BE UNDONE", "DANGER", "ABORT ", "Continue", " ABORT")
if (prompt != "Continue")
return
if(!O.can_vv_get(variable))
return
+5
View File
@@ -20,6 +20,11 @@
#define MOVEMENT_FAILED 0 // Move() returned false for whatever reason and the mob didn't move.
#define MOVEMENT_SUCCESSFUL 1 // Move() returned true and the mob hopefully moved.
// Results of pre-attack checks
#define ATTACK_ON_COOLDOWN -1 // Recently attacked and needs to try again soon.
#define ATTACK_FAILED 0 // Something else went wrong! Maybe they moved away!
#define ATTACK_SUCCESSFUL 1 // We attacked (or tried to, misses count too)
// Reasons for targets to not be valid. Based on why, the AI responds differently.
#define AI_TARGET_VALID 0 // We can fight them.
#define AI_TARGET_INVIS 1 // They were in field of view but became invisible. Switch to STANCE_BLINDFIGHT if no other viable targets exist.
+10 -11
View File
@@ -70,21 +70,21 @@
/datum/ai_holder/proc/melee_attack(atom/A)
pre_melee_attack(A)
. = holder.IAttack(A)
if(.)
if(. == ATTACK_SUCCESSFUL)
post_melee_attack(A)
// Ditto.
/datum/ai_holder/proc/ranged_attack(atom/A)
pre_ranged_attack(A)
. = holder.IRangedAttack(A)
if(.)
if(. == ATTACK_SUCCESSFUL)
post_ranged_attack(A)
// Most mobs probably won't have this defined but we don't care.
/datum/ai_holder/proc/special_attack(atom/movable/AM)
pre_special_attack(AM)
. = holder.ISpecialAttack(AM)
if(.)
if(. == ATTACK_SUCCESSFUL)
post_special_attack(AM)
// Called when within striking/shooting distance, however cooldown is not considered.
@@ -218,7 +218,6 @@
var/dir_to_target = get_dir(holder, target_atom)
holder.face_atom(target_atom)
ai_log("breakthrough() : Exiting", AI_LOG_DEBUG)
// Sometimes the mob will try to hit something diagonally, and generally this fails.
// So instead we will try two more times with some adjustments if the attack fails.
@@ -274,32 +273,32 @@
for(var/obj/structure/window/W in problem_turf)
if(W.dir == reverse_dir[holder.dir]) // So that windows get smashed in the right order
ai_log("destroy_surroundings() : Attacking side window.", AI_LOG_INFO)
return holder.IAttack(W)
return melee_attack(W)
else if(W.is_fulltile())
ai_log("destroy_surroundings() : Attacking full tile window.", AI_LOG_INFO)
return holder.IAttack(W)
return melee_attack(W)
// Kill hull shields in the way.
for(var/obj/effect/energy_field/shield in problem_turf)
if(shield.density) // Don't attack shields that are already down.
ai_log("destroy_surroundings() : Attacking hull shield.", AI_LOG_INFO)
return holder.IAttack(shield)
return melee_attack(shield)
// Kill common obstacle in the way like tables.
var/obj/structure/obstacle = locate(/obj/structure, problem_turf)
if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
ai_log("destroy_surroundings() : Attacking generic structure.", AI_LOG_INFO)
return holder.IAttack(obstacle)
return melee_attack(obstacle)
for(var/obj/machinery/door/D in problem_turf) // Required since firelocks take up the same turf.
if(D.density)
ai_log("destroy_surroundings() : Attacking closed door.", AI_LOG_INFO)
return holder.IAttack(D)
return melee_attack(D)
ai_log("destroy_surroundings() : Exiting due to nothing to attack.", AI_LOG_INFO)
return FALSE // Nothing to attack.
return ATTACK_FAILED // Nothing to attack.
// Override for special behaviour.
/datum/ai_holder/proc/can_violently_breakthrough()
return violent_breakthrough
return violent_breakthrough
+8 -3
View File
@@ -9,13 +9,14 @@
var/home_low_priority = FALSE // If true, the mob will not go home unless it has nothing better to do, e.g. its following someone.
var/max_home_distance = 3 // How far the mob can go away from its home before being told to go_home().
// Note that there is a 'BYOND cap' of 14 due to limitations of get_/step_to().
// Wandering.
var/wander = FALSE // If true, the mob will randomly move in the four cardinal directions when idle.
var/wander_delay = 0 // How many ticks until the mob can move a tile in handle_wander_movement().
var/base_wander_delay = 2 // What the above var gets set to when it wanders. Note that a tick happens every half a second.
var/wander_when_pulled = FALSE // If the mob will refrain from wandering if someone is pulling it.
// Breakthrough
var/failed_breakthroughs = 0 // How many times we've failed to breakthrough something lately
/datum/ai_holder/proc/walk_to_destination()
ai_log("walk_to_destination() : Entering.",AI_LOG_TRACE)
@@ -90,7 +91,9 @@
// step_to(holder, A)
if(holder.IMove(get_step_to(holder, A)) == MOVEMENT_FAILED)
ai_log("walk_path() : Failed to move, attempting breakthrough.", AI_LOG_INFO)
breakthrough(A) // We failed to move, time to smash things.
if(!breakthrough(A) && failed_breakthroughs++ >= 5) // We failed to move, time to smash things.
give_up_movement()
failed_breakthroughs = 0
return
if(move_once() == FALSE) // Start walking the path.
@@ -106,7 +109,9 @@
ai_log("walk_path() : Going to IMove().", AI_LOG_TRACE)
if(holder.IMove(get_step_to(holder, A)) == MOVEMENT_FAILED )
ai_log("walk_path() : Failed to move, attempting breakthrough.", AI_LOG_INFO)
breakthrough(A) // We failed to move, time to smash things.
if(!breakthrough(A) && failed_breakthroughs++ >= 5) // We failed to move, time to smash things.
give_up_movement()
failed_breakthroughs = 0
ai_log("walk_path() : Exited.", AI_LOG_TRACE)
+2 -2
View File
@@ -8,7 +8,7 @@
/mob/living/simple_mob/IAttack(atom/A)
if(!canClick()) // Still on cooldown from a "click".
return FALSE
return ATTACK_ON_COOLDOWN
return attack_target(A) // This will set click cooldown.
/mob/living/proc/IRangedAttack(atom/A)
@@ -16,7 +16,7 @@
/mob/living/simple_mob/IRangedAttack(atom/A)
if(!canClick()) // Still on cooldown from a "click".
return FALSE
return ATTACK_ON_COOLDOWN
return shoot_target(A)
// Test if the AI is allowed to attempt a ranged attack.
+2 -2
View File
@@ -26,7 +26,7 @@
/obj/machinery/gateway/centerstation
density = 1
icon_state = "offcenter"
use_power = 1
use_power = USE_POWER_IDLE
//warping vars
var/list/linked = list()
@@ -142,7 +142,7 @@ obj/machinery/gateway/centerstation/process()
/obj/machinery/gateway/centeraway
density = 1
icon_state = "offcenter"
use_power = 0
use_power = USE_POWER_OFF
var/calibrated = 1
var/list/linked = list() //a list of the connected gateway chunks
var/ready = 0
@@ -4,11 +4,11 @@
/datum/gear/cane/white
display_name = "white cane"
path = /obj/item/weapon/cane/whitecane
path = /obj/item/weapon/cane/white
/datum/gear/cane/white2
display_name = "telescopic white cane"
path = /obj/item/weapon/melee/collapsable_whitecane
path = /obj/item/weapon/cane/white/collapsible
/datum/gear/crutch
display_name = "crutch"
+3
View File
@@ -229,6 +229,7 @@
SPECIES_TESHARI = 'icons/mob/species/seromi/gloves.dmi',
SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi'
)
drop_sound = 'sound/items/drop/gloves.ogg'
/obj/item/clothing/proc/set_clothing_index()
return
@@ -362,6 +363,7 @@
SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi',
SPECIES_VOX = 'icons/mob/species/vox/head.dmi'
)
drop_sound = 'sound/items/drop/hat.ogg'
/obj/item/clothing/head/attack_self(mob/user)
if(brightness_on)
@@ -517,6 +519,7 @@
SPECIES_TESHARI = 'icons/mob/species/seromi/shoes.dmi',
SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi'
)
drop_sound = 'sound/items/drop/shoes.ogg'
/obj/item/clothing/shoes/proc/draw_knife()
set name = "Draw Boot Knife"
+15 -4
View File
@@ -121,13 +121,24 @@
set name = "Remove Accessory"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
if(!istype(usr, /mob/living))
return
if(usr.stat)
return
var/obj/item/clothing/accessory/A
if(LAZYLEN(accessories))
A = input("Select an accessory to remove from [src]") as null|anything in accessories
var/accessory_amount = LAZYLEN(accessories)
if(accessory_amount)
if(accessory_amount == 1)
A = accessories[1] // If there's only one accessory, just remove it without any additional prompts.
else
A = input("Select an accessory to remove from \the [src]") as null|anything in accessories
if(A)
remove_accessory(usr,A)
if(!LAZYLEN(accessories))
src.verbs -= /obj/item/clothing/proc/removetie_verb
accessories = null
+157
View File
@@ -0,0 +1,157 @@
/*
* Antagonist-specific gloves, such as traitor or ling-only types.
*/
// Thief - Traitor / Merc
/obj/item/clothing/gloves/sterile/thieves
name = "sterile gloves"
desc = "Sterile gloves."
description_antag = "These gloves are uniquely suited for stealing, as well as breaking and entering. They have minor insulation.\
Attempting to 'help' someone will open their backpack, if it exists, or their belt if they have no backpack, allowing you to deposit\
items into the inventories. Be careful about making too much noise.\
Disarm intent will swap the items in your LEFT pockets. Grab will swap RIGHT pockets."
icon_state = "latex"
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
siemens_coefficient = 0.5 // Not perfect, but slightly more protective than nothing.
permeability_coefficient = 0.01
germ_level = 0
fingerprint_chance = 10 // They're thieves' gloves. What do you think?
/obj/item/clothing/gloves/sterile/thieves/proc/pickpocket(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/proximity)
if(!proximity || !user || !target)
return 0
if(!istype(target))
return 0
if(user.a_intent != I_HURT && (turn(target.dir, 180) == get_dir(user, target)))
to_chat(target, "<span class='warning'>[user] rifles in your pockets!</span>")
if(user.a_intent == I_HELP)
if(istype(target.back,/obj/item/weapon/storage) && do_after(user, 3 SECONDS, target))
var/obj/item/weapon/storage/Backpack = target.back
Backpack.open(user)
else if(istype(target.belt, /obj/item/weapon/storage) && do_after(user, 5 SECONDS, target))
var/obj/item/weapon/storage/Belt = target.belt
Belt.open(user)
return 1
if(user.a_intent == I_DISARM)
var/obj/item/LTarg = target.l_store
var/obj/item/LUser = user.l_store
if(do_after(user, 1 SECOND, target))
if(istype(LTarg) && do_after(user, 1 SECOND, target))
target.drop_from_inventory(LTarg)
target.l_store = null
user.l_store = LTarg
LTarg.forceMove(user)
LTarg.equipped(user, slot_l_store)
else
target.drop_from_inventory(LTarg)
if(istype(LUser) && do_after(user, 1 SECOND, target))
user.drop_from_inventory(LUser)
target.l_store = LUser
LUser.forceMove(target)
LUser.equipped(target, slot_l_store)
else if(istype(LUser) && LUser != user.l_store) // We've taken something, so drop the one that's in bluespace.
user.drop_from_inventory(LUser)
return 1
if(user.a_intent == I_GRAB)
var/obj/item/RTarg = target.r_store
var/obj/item/RUser = user.r_store
if(do_after(user, 1 SECOND, target))
if(istype(RTarg) && do_after(user, 1 SECOND, target))
target.drop_from_inventory(RTarg)
target.r_store = null
user.r_store = RTarg
RTarg.forceMove(user)
RTarg.equipped(user, slot_r_store)
else
target.drop_from_inventory(RTarg)
if(istype(RUser) && do_after(user, 1 SECOND, target))
user.drop_from_inventory(RUser)
target.r_store = RUser
RUser.forceMove(target)
RUser.equipped(target, slot_r_store)
else if(istype(RUser) && RUser != user.r_store) // We've taken something, so drop the one that's in bluespace.
user.drop_from_inventory(RUser)
return 1
/obj/item/clothing/gloves/sterile/thieves/Touch(var/atom/A, var/proximity)
if(proximity && istype(usr, /mob/living/carbon/human) && do_after(usr, 1 SECOND, A))
return pickpocket(usr, A, proximity)
return 0
// Buzzer Ring - Traitor, Merc.
/obj/item/clothing/gloves/ring/buzzer
name = "ring"
desc = "A plain metal band."
description_antag = "This morphium-alloy ring continually generates an electric field, capable of electrocuting a target while not injuring the wearer.\
The device is also capable of 'frankenstein'-ing a corpse, long after normal technology would be able to save them. The body will still be tied to the\
normal damage limits for survival, however, so care must be taken."
icon_state = "material"
var/battery_type = /obj/item/weapon/cell/device/weapon/recharge
var/obj/item/weapon/cell/battery = null
/obj/item/clothing/gloves/ring/buzzer/get_cell()
return battery
/obj/item/clothing/gloves/ring/buzzer/Initialize()
..()
if(!battery)
battery = new battery_type(src)
/obj/item/clothing/gloves/ring/buzzer/Touch(var/atom/A, var/proximity)
if(proximity && istype(usr, /mob/living/carbon/human))
return zap(usr, A, proximity)
return 0
/obj/item/clothing/gloves/ring/buzzer/proc/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity)
. = FALSE
if(user.a_intent == I_HURT && battery.percent() >= 50)
if(isliving(target))
var/mob/living/L = target
if(ishuman(L) && battery.percent() >= 90) // Silent text-wise, for maximum potential for gimmicks.
var/mob/living/carbon/human/H = L
if(H.stat == DEAD)
. = TRUE
do_defib(H)
to_chat(L, "<span class='warning'>You feel a powerful shock!</span>")
if(!.)
playsound(L, 'sound/effects/sparks7.ogg', 40, 1)
L.electrocute_act(battery.percent() * 0.25, src)
battery.emp_act(2)
return .
return 0
/obj/item/clothing/gloves/ring/buzzer/proc/do_defib(var/mob/living/carbon/human/H = null)
if(!istype(H))
return 0
dead_mob_list.Remove(H)
if((H in living_mob_list) || (H in dead_mob_list))
WARNING("Mob [H] was ring-defibbed but already in the living or dead list still!")
living_mob_list += H
H.timeofdeath = 0
H.set_stat(UNCONSCIOUS)
H.failed_last_breath = 0
H.reload_fullscreen()
H.emote("gasp")
H.Weaken(rand(10,25))
H.updatehealth()
battery.emp_act(1)
+1 -6
View File
@@ -1,9 +1,4 @@
/obj/item/clothing/gloves
desc = "you aren't supposed to see this."
name = "strange gloves"
icon_state = "black"
item_state = "bgloves"
drop_sound = 'sound/items/drop/gloves.ogg'
/obj/item/clothing/gloves/yellow
desc = "These gloves will protect the wearer from electric shock."
@@ -1,11 +1,6 @@
//Hat Station 13
/obj/item/clothing/head/
name = "hat"
desc = "Apply on head."
drop_sound = 'sound/items/drop/hat.ogg'
/obj/item/clothing/head/collectable
name = "collectable hat"
desc = "A rare collectable hat."
+1 -1
View File
@@ -169,7 +169,7 @@
body_parts_covered = HEAD|FACE|EYES
w_class = ITEMSIZE_SMALL
siemens_coefficient = 0.9
/obj/item/clothing/mask/nock_scarab
name = "nock mask (blue, scarab)"
desc = "To Nock followers, masks symbolize rebirth and a new persona. Damaging the wearer's mask is generally considered an attack on their person itself."
+1 -1
View File
@@ -1,6 +1,6 @@
//Generic Ring
/obj/item/clothing/ring
/obj/item/clothing/gloves/ring
name = "generic ring"
desc = "Torus shaped finger decoration."
icon_state = "material"
-5
View File
@@ -1,8 +1,3 @@
/obj/item/clothing/shoes
name = "shoes"
icon_state = "white"
desc = "A pair of shoes."
drop_sound = 'sound/items/drop/shoes.ogg'
/obj/item/clothing/shoes/black
name = "black shoes"
@@ -36,7 +36,7 @@
icon_state = "flash"
interface_name = "mounted flash"
interface_desc = "Stuns your target by blinding them with a bright light."
device_type = /obj/item/device/flash
device_type = /obj/item/device/flash/robot
/obj/item/rig_module/device/plasmacutter
name = "hardsuit plasma cutter"
+13 -4
View File
@@ -231,6 +231,15 @@
update_airtight(piece, 0) // Unseal
update_icon(1)
/obj/item/weapon/rig/proc/cut_suit()
offline = 2
canremove = 1
toggle_piece("helmet", loc, ONLY_RETRACT, TRUE)
toggle_piece("gauntlets", loc, ONLY_RETRACT, TRUE)
toggle_piece("boots", loc, ONLY_RETRACT, TRUE)
toggle_piece("chest", loc, ONLY_RETRACT, TRUE)
update_icon(1)
/obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M,var/instant)
if(sealing) return
@@ -739,15 +748,15 @@
wearer.wearing_rig = src
update_icon()
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode)
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode, var/forced = FALSE)
if(sealing || !cell || !cell.charge)
if((sealing || !cell || !cell.charge) && !forced)
return
if(!istype(wearer) || (!wearer.back == src && !wearer.belt == src))
if((!istype(wearer) || (!wearer.back == src && !wearer.belt == src)) && !forced)
return
if(usr == wearer && (usr.stat||usr.paralysis||usr.stunned)) // If the usr isn't wearing the suit it's probably an AI.
if((usr == wearer && (usr.stat||usr.paralysis||usr.stunned)) && !forced) // If the usr isn't wearing the suit it's probably an AI.
return
var/obj/item/check_slot
+16 -16
View File
@@ -32,7 +32,12 @@
brightness_on = 4
on = 0
/obj/item/clothing/head/helmet/space/verb/toggle_camera()
/obj/item/clothing/head/helmet/space/Initialize()
. = ..()
if(camera_networks)
verbs |= /obj/item/clothing/head/helmet/space/proc/toggle_camera
/obj/item/clothing/head/helmet/space/proc/toggle_camera()
set name = "Toggle Helmet Camera"
set desc = "Turn your helmet's camera on or off."
set category = "Hardsuit"
@@ -40,23 +45,18 @@
if(usr.stat || usr.restrained() || usr.incapacitated())
return
if(camera_networks)
if(!camera)
camera = new /obj/machinery/camera(src)
camera.replace_networks(camera_networks)
camera.set_status(FALSE) //So the camera will activate in the following check.
if(camera.status == TRUE)
camera.set_status(FALSE)
to_chat(usr, "<font color='blue'>Camera deactivated.</font>")
else
camera.set_status(TRUE)
camera.c_tag = usr.name
to_chat(usr, "<font color='blue'>User scanned as [camera.c_tag]. Camera activated.</font>")
if(!camera)
camera = new /obj/machinery/camera(src)
camera.replace_networks(camera_networks)
camera.set_status(FALSE) //So the camera will activate in the following check.
if(camera.status == TRUE)
camera.set_status(FALSE)
to_chat(usr, "<font color='blue'>Camera deactivated.</font>")
else
to_chat(usr, "This helmet does not have a built-in camera.")
return
camera.set_status(TRUE)
camera.c_tag = usr.name
to_chat(usr, "<font color='blue'>User scanned as [camera.c_tag]. Camera activated.</font>")
/obj/item/clothing/head/helmet/space/examine()
..()
@@ -2,7 +2,7 @@
name = "shoulder holster"
desc = "A handgun holster."
icon_state = "holster"
slot = ACCESSORY_SLOT_TORSO //Legacy/balance purposes
slot = ACCESSORY_SLOT_WEAPON
concealed_holster = 1
var/obj/item/holstered = null
var/holster_in = 'sound/items/holsterin.ogg'
+1 -1
View File
@@ -20,7 +20,7 @@ log transactions
icon = 'icons/obj/terminals.dmi'
icon_state = "atm"
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 10
circuit = /obj/item/weapon/circuitboard/atm
var/datum/money_account/authenticated_account
+6 -4
View File
@@ -1,7 +1,9 @@
// error_cooldown items will either be positive (cooldown time) or negative (silenced error)
// If negative, starts at -1, and goes down by 1 each time that error gets skipped
var/total_runtimes = 0
var/total_runtimes_skipped = 0
GLOBAL_VAR_INIT(total_runtimes, 0)
GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
// The ifdef needs to be down here, since the error viewer references total_runtimes
#ifdef DEBUG
/world/Error(var/exception/e, var/datum/e_src)
@@ -10,7 +12,7 @@ var/total_runtimes_skipped = 0
return ..()
if(!GLOB.error_last_seen) // A runtime is occurring too early in start-up initialization
return ..()
total_runtimes++
GLOB.total_runtimes++
var/erroruid = "[e.file][e.line]"
var/last_seen = GLOB.error_last_seen[erroruid]
@@ -20,7 +22,7 @@ var/total_runtimes_skipped = 0
last_seen = world.time
if(cooldown < 0)
GLOB.error_cooldown[erroruid]-- // Used to keep track of skip count for this error
total_runtimes_skipped++
GLOB.total_runtimes_skipped++
return // Error is currently silenced, skip handling it
// Handle cooldowns and silencing spammy errors
+1 -1
View File
@@ -88,7 +88,7 @@ var/global/datum/ErrorViewer/ErrorCache/error_cache = null
/datum/ErrorViewer/ErrorCache/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear)
var/html = buildHeader(null, linear, refreshable=1)
html += "[total_runtimes] runtimes, [total_runtimes_skipped] skipped<br><br>"
html += "[GLOB.total_runtimes] runtimes, [GLOB.total_runtimes_skipped] skipped<br><br>"
if(!linear)
html += "organized | [makeLink("linear", null, 1)]<hr>"
var/datum/ErrorViewer/ErrorSource/error_source
+2 -2
View File
@@ -17,7 +17,7 @@
gravity_is_on = 0
for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
A.gravitychange(gravity_is_on)
/datum/event/gravity/end()
if(!gravity_is_on)
@@ -25,6 +25,6 @@
for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
A.gravitychange(gravity_is_on)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored")
@@ -10,7 +10,7 @@
icon = 'icons/obj/cooking_machines.dmi'
density = 1
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 5
var/on_icon // Icon state used when cooking.
+1 -1
View File
@@ -14,7 +14,7 @@
var/gib_time = 40 // Time from starting until meat appears
var/gib_throw_dir = WEST // Direction to spit meat and gibs in.
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 2
active_power_usage = 500
+1 -1
View File
@@ -14,7 +14,7 @@
icon_state = "icecream_vat"
density = 1
anchored = 0
use_power = 0
use_power = USE_POWER_OFF
flags = OPENCONTAINER | NOREACT
var/list/product_types = list()
+1 -1
View File
@@ -5,7 +5,7 @@
icon_state = "mw"
density = 1
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 5
active_power_usage = 100
clicksound = "button"
+1 -1
View File
@@ -6,7 +6,7 @@
icon_state = "smartfridge"
density = 1
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 5
active_power_usage = 100
flags = NOREACT
@@ -24,11 +24,11 @@
/datum/event2/event/gravity/start()
for(var/area/A in all_areas)
if(A.z in get_location_z_levels())
A.gravitychange(FALSE, A)
A.gravitychange(FALSE)
/datum/event2/event/gravity/end()
for(var/area/A in all_areas)
if(A.z in get_location_z_levels())
A.gravitychange(TRUE, A)
A.gravitychange(TRUE)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored")
+10 -10
View File
@@ -4,7 +4,7 @@
icon_keyboard = "tech_key"
icon_screen = "holocontrol"
use_power = 1
use_power = USE_POWER_IDLE
active_power_usage = 8000 //8kW for the scenery + 500W per holoitem
var/item_power_usage = 500
@@ -224,7 +224,7 @@
damaged = 1
loadProgram(powerdown_program, 0)
active = 0
use_power = 1
update_use_power(USE_POWER_IDLE)
for(var/mob/M in range(10,src))
M.show_message("The holodeck overloads!")
@@ -268,10 +268,10 @@
loadProgram(powerdown_program, 0)
if(!linkedholodeck.has_gravity)
linkedholodeck.gravitychange(1,linkedholodeck)
linkedholodeck.gravitychange(1)
active = 0
use_power = 1
update_use_power(USE_POWER_IDLE)
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/prog, var/check_delay = 1)
@@ -301,7 +301,7 @@
last_change = world.time
active = 1
use_power = 2
use_power = USE_POWER_ACTIVE
for(var/item in holographic_objs)
derez(item)
@@ -362,19 +362,19 @@
last_gravity_change = world.time
active = 1
use_power = 1
use_power = USE_POWER_IDLE
if(A.has_gravity)
A.gravitychange(0,A)
A.gravitychange(0)
else
A.gravitychange(1,A)
A.gravitychange(1)
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
//Turn it back to the regular non-holographic room
loadProgram(powerdown_program, 0)
if(!linkedholodeck.has_gravity)
linkedholodeck.gravitychange(1,linkedholodeck)
linkedholodeck.gravitychange(1)
active = 0
use_power = 1
use_power = USE_POWER_IDLE
+1 -1
View File
@@ -391,7 +391,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u
var/eventstarted = 0
anchored = 1.0
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
+3 -3
View File
@@ -8,7 +8,7 @@
icon_state = "station_map"
anchored = 1
density = 0
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 10
active_power_usage = 500
circuit = /obj/item/weapon/circuitboard/station_map
@@ -126,7 +126,7 @@
GLOB.moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
GLOB.dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
GLOB.destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching)
update_use_power(2)
update_use_power(USE_POWER_ACTIVE)
if(bogus)
to_chat(user, "<span class='warning'>The holomap failed to initialize. This area of space cannot be mapped.</span>")
@@ -156,7 +156,7 @@
GLOB.dir_set_event.unregister(watching_mob, src)
GLOB.destroyed_event.unregister(watching_mob, src)
watching_mob = null
update_use_power(1)
update_use_power(USE_POWER_IDLE)
/obj/machinery/station_map/power_change()
. = ..()
+1 -1
View File
@@ -37,7 +37,7 @@
icon_state = "hydrotray3"
density = 1
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
var/obj/item/seeds/seed // Currently loaded seed packet.
var/obj/item/weapon/disk/botany/loaded_disk //Currently loaded data disk.
+1 -1
View File
@@ -12,7 +12,7 @@
spawn(75)
if(!host.ckey && !host.client)
host.death() // This seems redundant, but a lot of mobs don't
host.stat = DEAD // handle death() properly. Better safe than etc.
host.set_stat(DEAD) // handle death() properly. Better safe than etc.
host.visible_message("<span class='danger'>[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.</span>")
var/total_yield = rand(1,3)
+1 -1
View File
@@ -24,7 +24,7 @@
icon_state = "seeds"
density = 1
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 100
var/seeds_initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction
+1 -1
View File
@@ -2,7 +2,7 @@
name = "soil"
icon_state = "soil"
density = 0
use_power = 0
use_power = USE_POWER_OFF
mechanical = 0
tray_light = 0
frozen = -1
+1 -1
View File
@@ -22,7 +22,7 @@
/turf/proc/lighting_clear_overlay()
if(lighting_overlay)
qdel(lighting_overlay)
qdel(lighting_overlay, force = TRUE)
for(var/datum/lighting_corner/C in corners)
C.update_active()
+6
View File
@@ -39,6 +39,9 @@
if (SSatoms.initialized == INITIALIZATION_INSSATOMS)
return // let proper initialisation handle it later
var/prev_shuttle_queue_state = SSshuttles.block_init_queue
SSshuttles.block_init_queue = TRUE
var/list/atom/atoms = list()
var/list/area/areas = list()
var/list/obj/structure/cable/cables = list()
@@ -71,6 +74,9 @@
var/area/A = I
A.power_change()
SSshuttles.block_init_queue = prev_shuttle_queue_state
SSshuttles.process_init_queues() // We will flush the queue unless there were other blockers, in which case they will do it.
admin_notice("<span class='danger'>Submap initializations finished.</span>", R_DEBUG)
/datum/map_template/proc/load_new_z(var/centered = FALSE, var/orientation = 0)
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/machinery/mining
icon = 'icons/obj/mining_drill.dmi'
anchored = 0
use_power = 0 //The drill takes power directly from a cell.
use_power = USE_POWER_OFF //The drill takes power directly from a cell.
density = 1
layer = MOB_LAYER+0.1 //So it draws over mobs in the tile north of it.
+3
View File
@@ -212,6 +212,9 @@ turf/simulated/mineral/floor/light_corner
if(istype(get_step(src, direction), /turf/simulated/mineral))
var/turf/simulated/mineral/M = get_step(src, direction)
M.update_icon()
if(istype(get_step(src, direction), /turf/simulated/wall/solidrock))
var/turf/simulated/wall/solidrock/M = get_step(src, direction)
M.update_icon()
/turf/simulated/mineral/ex_act(severity)
+42
View File
@@ -0,0 +1,42 @@
/datum/modifier/feysight
name = "feysight"
desc = "You are filled with an inner peace, and widened sight."
client_color = "#42e6ca"
on_created_text = "<span class='alien'>You feel an inner peace as your mind's eye expands!</span>"
on_expired_text = "<span class='notice'>Your sight returns to what it once was.</span>"
stacks = MODIFIER_STACK_EXTEND
accuracy = -15
accuracy_dispersion = 1
/datum/modifier/feysight/on_applied()
holder.see_invisible = 60
holder.see_invisible_default = 60
/datum/modifier/feysight/on_expire()
holder.see_invisible_default = initial(holder.see_invisible_default)
holder.see_invisible = holder.see_invisible_default
/datum/modifier/feysight/can_apply(var/mob/living/L)
if(L.stat)
to_chat(L, "<span class='warning'>You can't be unconscious or dead to experience tranquility.</span>")
return FALSE
if(!L.is_sentient())
return FALSE // Drones don't feel anything.
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.species.name == "Diona")
to_chat(L, "<span class='warning'>You feel strange for a moment, but it passes.</span>")
return FALSE // Happy trees aren't affected by tranquility.
return ..()
/datum/modifier/feysight/tick()
..()
if(ishuman(holder))
var/mob/living/carbon/human/H = holder
H.druggy = min(15, H.druggy + 4)
+7 -1
View File
@@ -17,6 +17,9 @@
/datum/modifier/fire/tick()
holder.inflict_heat_damage(damage_per_tick)
/datum/modifier/fire/weak
damage_per_tick = 1
/*
* Modifier used by projectiles, like the flamethrower, that rely heavily on fire_stacks to persist.
*/
@@ -29,8 +32,11 @@
expire()
else if(holder.fire_stacks > 0)
holder.fire_stacks -= 1
holder.fire_stacks -= 0.5
/datum/modifier/fire/stack_managed/intense
mob_overlay_state = "on_fire_intense"
damage_per_tick = 10
/datum/modifier/fire/stack_managed/weak
damage_per_tick = 1
+4 -3
View File
@@ -59,7 +59,7 @@
// Checks if the modifier should be allowed to be applied to the mob before attaching it.
// Override for special criteria, e.g. forbidding robots from receiving it.
/datum/modifier/proc/can_apply(var/mob/living/L)
/datum/modifier/proc/can_apply(var/mob/living/L, var/suppress_output = FALSE)
return TRUE
// Checks to see if this datum should continue existing.
@@ -113,7 +113,8 @@
// Call this to add a modifier to a mob. First argument is the modifier type you want, second is how long it should last, in ticks.
// Third argument is the 'source' of the modifier, if it's from someone else. If null, it will default to the mob being applied to.
// The SECONDS/MINUTES macro is very helpful for this. E.g. M.add_modifier(/datum/modifier/example, 5 MINUTES)
/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null, var/mob/living/origin = null)
// The fourth argument is a boolean to suppress failure messages, set it to true if the modifier is repeatedly applied (as chem-based modifiers are) to prevent chat-spam
/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null, var/mob/living/origin = null, var/suppress_failure = FALSE)
// First, check if the mob already has this modifier.
for(var/datum/modifier/M in modifiers)
if(ispath(modifier_type, M))
@@ -130,7 +131,7 @@
// If we're at this point, the mob doesn't already have it, or it does but stacking is allowed.
var/datum/modifier/mod = new modifier_type(src, origin)
if(!mod.can_apply(src))
if(!mod.can_apply(src, suppress_failure))
qdel(mod)
return
if(expire_at)
@@ -112,16 +112,18 @@ the artifact triggers the rage.
var/mob/living/carbon/human/H = holder
H.shock_stage = last_shock_stage
/datum/modifier/berserk/can_apply(var/mob/living/L)
/datum/modifier/berserk/can_apply(var/mob/living/L, var/suppress_failure = FALSE)
if(L.stat)
to_chat(L, "<span class='warning'>You can't be unconscious or dead to berserk.</span>")
if(!suppress_failure)
to_chat(L, "<span class='warning'>You can't be unconscious or dead to berserk.</span>")
return FALSE // It would be weird to see a dead body get angry all of a sudden.
if(!L.is_sentient())
return FALSE // Drones don't feel anything.
if(L.has_modifier_of_type(/datum/modifier/berserk_exhaustion))
to_chat(L, "<span class='warning'>You recently berserked, and cannot do so again while exhausted.</span>")
if(!suppress_failure)
to_chat(L, "<span class='warning'>You recently berserked, and cannot do so again while exhausted.</span>")
return FALSE // On cooldown.
if(L.isSynthetic())
@@ -135,7 +137,8 @@ the artifact triggers the rage.
return FALSE // Happy trees aren't affected by blood rages.
if(L.nutrition < nutrition_cost)
to_chat(L, "<span class='warning'>You are too hungry to berserk.</span>")
if(!suppress_failure)
to_chat(L, "<span class='warning'>You are too hungry to berserk.</span>")
return FALSE // Too hungry to enrage.
return ..()
+1 -1
View File
@@ -33,7 +33,7 @@
/obj/effect/landmark/mobcorpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
M.real_name = src.name
M.stat = 2 //Kills the new mob
M.set_stat(DEAD) //Kills the new mob
if(src.corpseuniform)
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
if(src.corpsesuit)
+24 -2
View File
@@ -85,6 +85,7 @@
"ED-209" = "ed209",
"Beepsky" = "secbot"
)
var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners.
/mob/observer/dead/New(mob/body)
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
@@ -93,8 +94,6 @@
plane = PLANE_GHOSTS //Why doesn't the var above work...???
verbs += /mob/observer/dead/proc/dead_tele
stat = DEAD
var/turf/T
if(ismob(body))
T = get_turf(body) //Where is the body located?
@@ -137,6 +136,9 @@
var/mob/target = locate(href_list["track"]) in mob_list
if(target)
ManualFollow(target)
if(href_list["reenter"])
reenter_corpse()
return
/mob/observer/dead/attackby(obj/item/W, mob/user)
if(istype(W,/obj/item/weapon/book/tome))
@@ -145,6 +147,11 @@
/mob/observer/dead/CanPass(atom/movable/mover, turf/target)
return TRUE
/mob/observer/dead/set_stat(var/new_stat)
if(new_stat != DEAD)
CRASH("It is best if observers stay dead, thank you.")
/*
Transfer_mind is there to check if mob is being deleted/not going to have a body.
Works together with spawning an observer, noted above.
@@ -805,3 +812,18 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
/mob/observer/dead/speech_bubble_appearance()
return "ghost"
// Lets a ghost know someone's trying to bring them back, and for them to get into their body.
// Mostly the same as TG's sans the hud element, since we don't have TG huds.
/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE)
if((last_revive_notification + 2 MINUTES) > world.time)
return
last_revive_notification = world.time
if(flashwindow)
window_flash(client)
if(message)
to_chat(src, "<span class='ghostalert'><font size=4>[message]</font></span>")
to_chat(src, "<span class='ghostalert'><a href=?src=[REF(src)];reenter=1>(Click to re-enter)</a></span>")
if(sound)
SEND_SOUND(src, sound(sound))
+1 -1
View File
@@ -76,7 +76,7 @@
if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it.
src.visible_message("<b>\The [src.name]</b> [deathmessage]")
stat = DEAD
set_stat(DEAD)
update_canmove()
+2 -2
View File
@@ -4,7 +4,7 @@
speech_verb = "chimpers"
ask_verb = "chimpers"
exclaim_verb = "screeches"
key = "6"
key = "C"
syllables = list("ook","eek")
machine_understands = 0
@@ -71,7 +71,7 @@
speech_verb = "chirps"
ask_verb = "tweets"
exclaim_verb = "squawks"
key = "m"
key = "B"
flags = RESTRICTED
machine_understands = 0
space_chance = 100
+1 -1
View File
@@ -79,7 +79,7 @@
/mob/living/bot/updatehealth()
if(status_flags & GODMODE)
health = getMaxHealth()
stat = CONSCIOUS
set_stat(CONSCIOUS)
else
health = getMaxHealth() - getFireLoss() - getBruteLoss()
oxyloss = 0
+3 -3
View File
@@ -51,7 +51,7 @@
if(paralysis && paralysis > 0)
blinded = 1
stat = UNCONSCIOUS
set_stat(UNCONSCIOUS)
if(halloss > 0)
adjustHalLoss(-3)
@@ -61,13 +61,13 @@
if(mind.active && client != null)
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
set_stat(UNCONSCIOUS)
else if(resting)
if(halloss > 0)
adjustHalLoss(-3)
else
stat = CONSCIOUS
set_stat(CONSCIOUS)
if(halloss > 0)
adjustHalLoss(-1)
+3 -3
View File
@@ -64,7 +64,7 @@
B.brainmob = null
brainmob.loc = src
brainmob.container = src
brainmob.stat = 0
brainmob.set_stat(CONSCIOUS)
dead_mob_list -= brainmob//Update dem lists
living_mob_list += brainmob
@@ -185,7 +185,7 @@
src.brainmob.add_language(LANGUAGE_EAL)
src.brainmob.loc = src
src.brainmob.container = src
src.brainmob.stat = 0
src.brainmob.set_stat(CONSCIOUS)
src.brainmob.silent = 0
radio = new(src)
dead_mob_list -= src.brainmob
@@ -230,7 +230,7 @@
/obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H)
brainmob.dna = H.dna
brainmob.timeofhostdeath = H.timeofdeath
brainmob.stat = 0
brainmob.set_stat(CONSCIOUS)
if(H.mind)
H.mind.transfer_to(brainmob)
return
+5 -1
View File
@@ -105,7 +105,11 @@
if (shock_damage<1)
return 0
src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution")
src.apply_damage(0.2 * shock_damage, BURN, def_zone, used_weapon="Electrocution") //shock the target organ
src.apply_damage(0.4 * shock_damage, BURN, BP_TORSO, used_weapon="Electrocution") //shock the torso more
src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part!
src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part!
playsound(loc, "sparks", 50, 1, -1)
if (shock_damage > 15)
src.visible_message(
@@ -280,7 +280,10 @@
var/randn = rand(1, 100)
last_push_time = world.time
if(!(species.flags & NO_SLIP) && randn <= 25)
// We ARE wearing shoes OR
// We as a species CAN be slipped when barefoot
// And also 1 in 4 because rngesus
if((shoes || !(species.flags & NO_SLIP)) && randn <= 25)
var/armor_check = run_armor_check(affecting, "melee")
apply_effect(3, WEAKEN, armor_check)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
@@ -4,7 +4,7 @@
if(status_flags & GODMODE)
health = getMaxHealth()
stat = CONSCIOUS
set_stat(CONSCIOUS)
return
var/total_burn = 0
@@ -527,8 +527,8 @@ emp_act
if(damtype != BURN && damtype != BRUTE) return
// The rig might soak this hit, if we're wearing one.
if(back && istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
if(istype(get_rig(),/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = get_rig()
rig.take_hit(damage)
// We may also be taking a suit breach.
@@ -177,7 +177,7 @@
compiled_vis |= O.enables_planes
//Check to see if we have a rig (ugh, blame rigs, desnowflake this)
var/obj/item/weapon/rig/rig = back
var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig) && rig.visor)
if(!rig.helmet || (head && rig.helmet == head))
if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses)
@@ -163,8 +163,8 @@
if(back)
if(istype(back,/obj/item/weapon/tank/jetpack))
thrust = back
else if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
else if(istype(get_rig(),/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = get_rig()
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
thrust = module.jets
break
@@ -1,6 +1,6 @@
/mob/living/carbon/human/process_resist()
//drop && roll
if(on_fire && !buckled)
if((on_fire || has_modifier_of_type(/datum/modifier/fire)) && !buckled)
adjust_fire_stacks(-1.2)
Weaken(3)
spin(32,2)
@@ -9,7 +9,7 @@
"<span class='notice'>You stop, drop, and roll!</span>"
)
sleep(30)
if(fire_stacks <= 0)
if(fire_stacks <= 0 && !(has_modifier_of_type(/datum/modifier/fire)))
visible_message(
"<span class='danger'>[src] has successfully extinguished themselves!</span>",
"<span class='notice'>You extinguish yourself.</span>"
+7 -13
View File
@@ -351,15 +351,10 @@
//Because rigs store their tanks out of reach of contents.Find(), a check has to be made to make
//sure the rig is still worn, still online, and that its air supply still exists.
var/obj/item/weapon/tank/rig_supply
if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
if(!rig.offline && (rig.air_supply && internal == rig.air_supply))
rig_supply = rig.air_supply
var/obj/item/weapon/rig/Rig = get_rig()
else if(istype(belt,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = belt
if(!rig.offline && (rig.air_supply && internal == rig.air_supply))
rig_supply = rig.air_supply
if(Rig)
rig_supply = Rig.air_supply
if ((!rig_supply && !contents.Find(internal)) || !((wear_mask && (wear_mask.item_flags & AIRTIGHT)) || (head && (head.item_flags & AIRTIGHT))))
internal = null
@@ -1094,9 +1089,9 @@
return 1
/mob/living/carbon/human/proc/set_stat(var/new_stat)
stat = new_stat
if(stat)
/mob/living/carbon/human/set_stat(var/new_stat)
. = ..()
if(. && stat)
update_skin(1)
/mob/living/carbon/human/handle_regular_hud_updates()
@@ -1357,7 +1352,7 @@
see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : see_invisible_default
var/tmp/glasses_processed = 0
var/obj/item/weapon/rig/rig = back
var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig) && rig.visor && !looking_elsewhere)
if(!rig.helmet || (head && rig.helmet == head))
if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses)
@@ -1511,7 +1506,6 @@
else
shock_stage = min(shock_stage, 160)
shock_stage = max(shock_stage-1, 0)
return
if(stat)
return 0
+2 -2
View File
@@ -78,8 +78,8 @@
/mob/living/carbon/human/GetVoice()
var/voice_sub
if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
if(istype(get_rig(),/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = get_rig()
// todo: fix this shit
if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice)
voice_sub = rig.speech.voice_holder.voice
@@ -102,18 +102,18 @@
else
if (src.paralysis || src.stunned || src.weakened || (status_flags & FAKEDEATH)) //Stunned etc.
if (src.stunned > 0)
src.stat = 0
src.set_stat(CONSCIOUS)
if (src.weakened > 0)
src.lying = 0
src.stat = 0
src.set_stat(CONSCIOUS)
if (src.paralysis > 0)
src.blinded = 0
src.lying = 0
src.stat = 0
src.set_stat(CONSCIOUS)
else
src.lying = 0
src.stat = 0
src.set_stat(CONSCIOUS)
if (src.stuttering) src.stuttering = 0
+3 -3
View File
@@ -98,11 +98,11 @@
updatehealth()
if(stat != DEAD)
if(paralysis)
stat = UNCONSCIOUS
set_stat(UNCONSCIOUS)
else if (status_flags & FAKEDEATH)
stat = UNCONSCIOUS
set_stat(UNCONSCIOUS)
else
stat = CONSCIOUS
set_stat(CONSCIOUS)
return 1
/mob/living/proc/handle_statuses()
+3 -4
View File
@@ -207,11 +207,10 @@ default behaviour is:
/mob/living/proc/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
set_stat(CONSCIOUS)
else
health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
//affects them once clothing is factored in. ~Errorage
/mob/living/proc/calculate_affecting_pressure(var/pressure)
@@ -411,7 +410,7 @@ default behaviour is:
if(!isnull(M.incoming_hal_damage_percent))
amount *= M.incoming_hal_damage_percent
if(!isnull(M.disable_duration_percent))
amount *= M.incoming_hal_damage_percent
amount *= M.disable_duration_percent
else if(amount < 0)
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
@@ -703,7 +702,7 @@ default behaviour is:
timeofdeath = 0
// restore us to conciousness
stat = CONSCIOUS
set_stat(CONSCIOUS)
// make the icons look correct
regenerate_icons()
+3 -1
View File
@@ -129,7 +129,6 @@
//Stun Beams
if(P.taser_effect)
stun_effect_act(0, P.agony, def_zone, P)
to_chat(src, "<font color='red'>You have been hit by [P]!</font>")
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
qdel(P)
@@ -364,6 +363,9 @@
handle_light()
update_fire()
if(has_modifier_of_type(/datum/modifier/fire))
remove_modifiers_of_type(/datum/modifier/fire)
/mob/living/proc/update_fire()
return
+10 -1
View File
@@ -9,4 +9,13 @@
return (!mover.density || !density || lying)
/mob/CanZASPass(turf/T, is_zone)
return ATMOS_PASS_YES
return ATMOS_PASS_YES
/mob/living/SelfMove(turf/n, direct)
// If on walk intent, don't willingly step into hazardous tiles.
// Unless the walker is confused.
if(m_intent == "walk" && confused <= 0)
if(!n.is_safe_to_enter(src))
to_chat(src, span("warning", "\The [n] is dangerous to move into."))
return FALSE // In case any code wants to know if movement happened.
return ..() // Parent call should make the mob move.
+4 -4
View File
@@ -291,7 +291,7 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply
name="Power Supply"
active_power_usage=50000 // Station AIs use significant amounts of power. This, when combined with charged SMES should mean AI lasts for 1hr without external power.
use_power = 2
use_power = USE_POWER_ACTIVE
power_channel = EQUIP
var/mob/living/silicon/ai/powered_ai = null
invisibility = 100
@@ -319,14 +319,14 @@ var/list/ai_verbs_default = list(
qdel(src)
return
if(powered_ai.APU_power)
use_power = 0
update_use_power(USE_POWER_OFF)
return
if(!powered_ai.anchored)
loc = powered_ai.loc
use_power = 0
update_use_power(USE_POWER_OFF)
use_power(50000) // Less optimalised but only called if AI is unwrenched. This prevents usage of wrenching as method to keep AI operational without power. Intellicard is for that.
if(powered_ai.anchored)
use_power = 2
update_use_power(USE_POWER_ACTIVE)
/mob/living/silicon/ai/proc/pick_icon()
set category = "AI Settings"
+1 -1
View File
@@ -169,7 +169,7 @@
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
set_stat(CONSCIOUS)
setOxyLoss(0)
else
health = 100 - getFireLoss() - getBruteLoss() // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine.
@@ -10,6 +10,6 @@
/mob/living/silicon/decoy/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
set_stat(CONSCIOUS)
else
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
+35 -9
View File
@@ -1,6 +1,7 @@
/mob/living/silicon
var/datum/ai_laws/laws = null
var/list/additional_law_channels = list("State" = "")
var/last_law_notification = null // Avoids receiving 5+ of them at once.
/mob/living/silicon/proc/laws_sanity_check()
if (!src.laws)
@@ -9,54 +10,79 @@
/mob/living/silicon/proc/has_zeroth_law()
return laws.zeroth_law != null
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg)
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg, notify = TRUE)
laws_sanity_check()
laws.set_zeroth_law(law, law_borg)
if(notify)
notify_of_law_change(law||law_borg ? "NEW ZEROTH LAW: <b>[istype(src, /mob/living/silicon/robot) && law_borg ? law_borg : law]</b>" : null)
log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]")
/mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg)
/mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg, notify = TRUE)
..()
if(tracking_entities)
to_chat(src, "<span class='warning'>Internal camera is currently being accessed.</span>")
/mob/living/silicon/proc/add_ion_law(var/law)
/mob/living/silicon/proc/add_ion_law(var/law, notify = TRUE)
laws_sanity_check()
laws.add_ion_law(law)
if(notify)
notify_of_law_change("NEW \[!ERROR!\] LAW: <b>[law]</b>")
log_and_message_admins("has given [src] the ion law: [law]")
/mob/living/silicon/proc/add_inherent_law(var/law)
/mob/living/silicon/proc/add_inherent_law(var/law, notify = TRUE)
laws_sanity_check()
laws.add_inherent_law(law)
if(notify)
notify_of_law_change("NEW CORE LAW: <b>[law]</b>")
log_and_message_admins("has given [src] the inherent law: [law]")
/mob/living/silicon/proc/add_supplied_law(var/number, var/law)
/mob/living/silicon/proc/add_supplied_law(var/number, var/law, notify = TRUE)
laws_sanity_check()
laws.add_supplied_law(number, law)
if(notify)
var/th = uppertext("[number]\th")
notify_of_law_change("NEW \[[th]\] LAW: <b>[law]</b>")
log_and_message_admins("has given [src] the supplied law: [law]")
/mob/living/silicon/proc/delete_law(var/datum/ai_law/law)
/mob/living/silicon/proc/delete_law(var/datum/ai_law/law, notify = TRUE)
laws_sanity_check()
laws.delete_law(law)
if(notify)
notify_of_law_change("LAW DELETED: <b>[law.law]</b>")
log_and_message_admins("has deleted a law belonging to [src]: [law.law]")
/mob/living/silicon/proc/clear_inherent_laws(var/silent = 0)
/mob/living/silicon/proc/clear_inherent_laws(var/silent = 0, notify = TRUE)
laws_sanity_check()
laws.clear_inherent_laws()
if(notify)
notify_of_law_change("CORE LAWS WIPED.")
if(!silent)
log_and_message_admins("cleared the inherent laws of [src]")
/mob/living/silicon/proc/clear_ion_laws(var/silent = 0)
/mob/living/silicon/proc/clear_ion_laws(var/silent = 0, notify = TRUE)
laws_sanity_check()
laws.clear_ion_laws()
if(notify)
notify_of_law_change("CORRUPTED LAWS WIPED.")
if(!silent)
log_and_message_admins("cleared the ion laws of [src]")
/mob/living/silicon/proc/clear_supplied_laws(var/silent = 0)
/mob/living/silicon/proc/clear_supplied_laws(var/silent = 0, notify = TRUE)
laws_sanity_check()
laws.clear_supplied_laws()
if(notify)
notify_of_law_change("NON-CORE LAWS WIPED.")
if(!silent)
log_and_message_admins("cleared the supplied laws of [src]")
/mob/living/silicon/proc/notify_of_law_change(message)
if((last_law_notification + 1 SECOND) > world.time)
return
last_law_notification = world.time
SEND_SOUND(src, 'sound/machines/defib_success.ogg')
window_flash(client)
to_chat(src, span("warning", message))
/mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws)
var/prefix = ""
if(MAIN_CHANNEL == lawchannel)
+1 -1
View File
@@ -30,6 +30,6 @@
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
set_stat(CONSCIOUS)
else
health = 100 - getBruteLoss() - getFireLoss()
@@ -257,7 +257,7 @@ var/list/mob_hat_cache = list()
/mob/living/silicon/robot/drone/updatehealth()
if(status_flags & GODMODE)
health = maxHealth
stat = CONSCIOUS
set_stat(CONSCIOUS)
return
health = maxHealth - (getBruteLoss() + getFireLoss())
return
@@ -11,7 +11,7 @@
density = 1
anchored = 1
use_power = 1
use_power = USE_POWER_IDLE
idle_power_usage = 20
active_power_usage = 5000
@@ -88,7 +88,7 @@
if (src.stat != 2) //Alive.
if (src.paralysis || src.stunned || src.weakened || !src.has_power) //Stunned etc.
src.stat = 1
src.set_stat(UNCONSCIOUS)
if (src.stunned > 0)
AdjustStunned(-1)
if (src.weakened > 0)
@@ -100,7 +100,7 @@
src.blinded = 0
else //Not stunned.
src.stat = 0
src.set_stat(CONSCIOUS)
AdjustConfused(-1)
@@ -1,7 +1,7 @@
/mob/living/silicon/robot/updatehealth()
if(status_flags & GODMODE)
health = getMaxHealth()
stat = CONSCIOUS
set_stat(CONSCIOUS)
return
health = getMaxHealth() - (getBruteLoss() + getFireLoss())
return
@@ -214,7 +214,7 @@
overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
addedSomething = 1
if ( addedSomething )
user.visible_message("<font color='blue'>[user] load some items onto their service tray.</font>")
user.visible_message("<font color='blue'>[user] loads some items onto their service tray.</font>")
return
@@ -507,4 +507,4 @@
return
to_chat(user, "You fail to pick up \the [A] with \the [src]")
return
return
+3 -5
View File
@@ -3,26 +3,24 @@
set waitfor = FALSE // For attack animations. Don't want the AI processor to get held up.
if(!A.Adjacent(src))
return FALSE
return ATTACK_FAILED
var/turf/their_T = get_turf(A)
face_atom(A)
if(melee_attack_delay)
// their_T.color = "#FF0000"
melee_pre_animation(A)
. = ATTACK_SUCCESSFUL //Shoving this in here as a 'best guess' since this proc is about to sleep and return and we won't be able to know the real value
handle_attack_delay(A, melee_attack_delay) // This will sleep this proc for a bit, which is why waitfor is false.
// Cooldown testing is done at click code (for players) and interface code (for AI).
setClickCooldown(get_attack_speed())
// Returns a value, but will be lost if
. = do_attack(A, their_T)
if(melee_attack_delay)
melee_post_animation(A)
// their_T.color = "#FFFFFF"
// This does the actual attack.
// This is a seperate proc for the purposes of attack animations.
@@ -18,7 +18,7 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have?
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
attacktext = list("kicked")
attacktext = list("pecked")
has_langs = list("Bird")
@@ -76,7 +76,7 @@
/mob/living/simple_mob/animal/passive/mouse/proc/splat()
src.health = 0
src.stat = DEAD
src.set_stat(DEAD)
src.icon_dead = "mouse_[body_color]_splat"
src.icon_state = "mouse_[body_color]_splat"
layer = MOB_LAYER
@@ -23,7 +23,7 @@
softfall = TRUE
parachuting = TRUE
attacktext = list("claws", "pecks")
attacktext = list("clawed", "pecked")
speak_emote = list("chirps", "caws")
has_langs = list("Bird")
response_help = "pets"
@@ -50,3 +50,8 @@
/mob/living/simple_mob/animal/space/bats/cult/cultify()
return
/mob/living/simple_mob/animal/space/bats/cult/strong
maxHealth = 60
health = 60
melee_damage_upper = 10
@@ -20,7 +20,7 @@
movement_cooldown = 0
hovering = TRUE
attacktext = list("slams into")
attacktext = list("slammed into")
attack_sound = 'sound/effects/slime_squish.ogg'
say_list_type = /datum/say_list/spore
@@ -118,7 +118,7 @@
desc = "A parasitic organism attached to a deceased body, controlling it directly as if it were a puppet."
melee_damage_lower += 8 // 10 total.
melee_damage_upper += 11 // 15 total.
attacktext = list("claws")
attacktext = list("clawed")
H.forceMove(src)
infested = H
@@ -84,6 +84,9 @@
damage = 0
nodamage = TRUE
impact_effect_type = /obj/effect/temp_visual/impact_effect
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
// Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and \
+5
View File
@@ -1016,6 +1016,11 @@ mob/proc/yank_out_object()
/mob/proc/updateicon()
return
// Please always use this proc, never just set the var directly.
/mob/proc/set_stat(var/new_stat)
. = (stat != new_stat)
stat = new_stat
/mob/verb/face_direction()
set name = "Face Direction"
@@ -119,6 +119,11 @@
icon_state = "hair_long_bedhead"
flags = HAIR_TIEABLE
bedheadlongest
name = "Bedhead Longest"
icon_state = "hair_longest_bedhead"
flags = HAIR_TIEABLE
beehive
name = "Beehive"
icon_state = "hair_beehive"
@@ -743,6 +748,11 @@
icon_state = "hair_rowbraid"
flags = HAIR_TIEABLE
sabitsuki
name = "Sabitsuki"
icon_state = "hair_sabitsuki"
flags = HAIR_VERY_SHORT
scully
name = "Scully"
icon_state = "hair_scully"
@@ -1294,6 +1304,11 @@
icon_state = "teshari_mushroom"
species_allowed = list(SPECIES_TESHARI)
teshari_bald
name = "Bald (use with FBP)"
icon_state = "bald"
species_allowed = list(SPECIES_TESHARI)
// Vox things
vox_braid_long
name = "Long Vox braid"
+1 -1
View File
@@ -144,7 +144,7 @@
return GLOB.all_languages["Noise"]
if(length(message) >= 2 && is_language_prefix(prefix))
var/language_prefix = lowertext(copytext(message, 2 ,3))
var/language_prefix = copytext(message, 2 ,3)
var/datum/language/L = GLOB.language_keys[language_prefix]
if (can_speak(L))
return L
@@ -2,7 +2,7 @@
/obj/machinery/ntnet_relay
name = "NTNet Quantum Relay"
desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile."
use_power = 2
use_power = USE_POWER_ACTIVE
active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational.
idle_power_usage = 100
icon_state = "bus"
@@ -38,9 +38,9 @@
/obj/machinery/ntnet_relay/process()
if(operable())
use_power = 2
update_use_power(USE_POWER_ACTIVE)
else
use_power = 1
update_use_power(USE_POWER_IDLE)
if(dos_overload)
dos_overload = max(0, dos_overload - dos_dissipate)
+5 -1
View File
@@ -15,6 +15,10 @@
/mob/proc/zMove(direction)
if(eyeobj)
return eyeobj.zMove(direction)
if(istype(loc,/obj/mecha))
var/obj/mecha/mech = loc
return mech.relaymove(src,direction)
if(!can_ztravel())
to_chat(src, "<span class='warning'>You lack means of travel in that direction.</span>")
return
@@ -115,7 +119,7 @@
if(incapacitated())
return FALSE
if(hovering)
if(hovering || is_incorporeal())
return TRUE
if(Process_Spacemove())
+7 -1
View File
@@ -150,8 +150,14 @@
var/turf/below = GetBelow(src)
return !below || below.is_space()
/turf/simulated/open/is_solid_structure()
return locate(/obj/structure/lattice, src) //counts as solid structure if it has a lattice (same as space)
/turf/simulated/open/is_safe_to_enter(mob/living/L)
if(L.can_fall())
for(var/obj/O in contents)
if(!O.CanFallThru(L, GetBelow(src)))
return TRUE // Can't fall through this, like lattice or catwalk.
if(!locate(/obj/structure/stairs) in GetBelow(src))
return FALSE
return FALSE // Falling on stairs is safe.
return ..()
+1 -1
View File
@@ -12,7 +12,7 @@
organ_verbs = list(/mob/living/carbon/human/proc/augment_menu) // Verbs added by the organ when present in the body.
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
forgiving_class = TRUE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
var/obj/item/integrated_object // Objects held by the organ, used for re-usable, deployable things.
var/integrated_object_type // Object type the organ will spawn.
+20
View File
@@ -98,6 +98,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi'
unavailable_to_build = 1
/datum/robolimb/unbranded_teshari
company = "Unbranded - Teshari"
species_cannot_use = list(SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT)
suggested_species = SPECIES_TESHARI
desc = "A simple robotic limb with a small, raptor-like design. Seems rather stiff."
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_teshari.dmi'
unavailable_to_build = 0
/datum/robolimb/nanotrasen
company = "NanoTrasen"
desc = "A simple but efficient robotic limb, created by NanoTrasen."
@@ -122,6 +130,15 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi'
unavailable_to_build = 1
/datum/robolimb/cenilimicybernetics_teshari
company = "Cenilimi Cybernetics"
species_cannot_use = list(SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT)
species_alternates = list(SPECIES_HUMAN = "NanoTrasen")
suggested_species = SPECIES_TESHARI
desc = "Made by a Teshari-owned company, for Teshari."
icon = 'icons/mob/human_races/cyberlimbs/cenilimicybernetics/cenilimicybernetics_teshari.dmi'
unavailable_to_build = 1
/datum/robolimb/bishop
company = "Bishop"
desc = "This limb has a white polymer casing with blue holo-displays."
@@ -465,3 +482,6 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
/obj/item/weapon/disk/species/zaddat
species = SPECIES_ZADDAT
/obj/item/weapon/disk/limb/cenilimicybernetics
company = "Cenilimi Cybernetics"
+2 -2
View File
@@ -14,7 +14,7 @@
..()
// This is very ghetto way of rebooting an IPC. TODO better way.
if(owner && owner.stat == DEAD)
owner.stat = 0
owner.set_stat(CONSCIOUS)
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/internal/cell/emp_act(severity)
@@ -68,7 +68,7 @@
stored_mmi.brainmob.languages = owner.languages
if(owner && owner.stat == DEAD)
owner.stat = 0
owner.set_stat(CONSCIOUS)
dead_mob_list -= owner
living_mob_list |= owner
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")

Some files were not shown because too many files have changed in this diff Show More