mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-25 06:06:34 +01:00
Updates to master and makes gravity event code be current.
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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!
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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."
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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 \
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
@@ -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
Reference in New Issue
Block a user