mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 20:48:56 +01:00
Merge upstream
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
## /tg/station v1.0.1
|
||||
## /tg/station
|
||||
|
||||
[](https://travis-ci.org/tgstation/tgstation) [](http://www.krihelinator.xyz)
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#define FORCE_MAP "_maps/cerestation.json"
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"map_name": "CereStation",
|
||||
"map_path": "map_files/Cerestation",
|
||||
"map_file": "cerestation.dmm",
|
||||
"minetype": "lavaland",
|
||||
"transition_config": "default"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "map_files\OmegaStation\OmegaStation.dmm"
|
||||
#include "map_files\PubbyStation\PubbyStation.dmm"
|
||||
#include "map_files\TgStation\tgstation.2.1.3.dmm"
|
||||
#include "map_files\Cerestation\cerestation.dmm"
|
||||
|
||||
#include "map_files\generic\Centcomm.dmm"
|
||||
#include "map_files\generic\SpaceStation.dmm"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -14964,6 +14964,10 @@
|
||||
name = "Centcom"
|
||||
},
|
||||
/area/centcom/evac)
|
||||
"Md" = (
|
||||
/obj/machinery/computer/emergency_shuttle,
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/escape)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
@@ -65807,7 +65811,7 @@ aa
|
||||
aa
|
||||
aa
|
||||
Fa
|
||||
Fh
|
||||
Md
|
||||
Fp
|
||||
FC
|
||||
Fh
|
||||
|
||||
+1
-17
@@ -52,22 +52,6 @@
|
||||
#define SS_SLEEPING 4 //fire() slept.
|
||||
#define SS_PAUSING 5 //in the middle of pausing
|
||||
|
||||
|
||||
//Timing subsystem
|
||||
//Don't run if there is an identical unique timer active
|
||||
#define TIMER_UNIQUE 0x1
|
||||
//For unique timers: Replace the old timer rather then not start this one
|
||||
#define TIMER_OVERRIDE 0x2
|
||||
//Timing should be based on how timing progresses on clients, not the sever.
|
||||
// tracking this is more expensive,
|
||||
// should only be used in conjuction with things that have to progress client side, such as animate() or sound()
|
||||
#define TIMER_CLIENT_TIME 0x4
|
||||
//Timer can be stopped using deltimer()
|
||||
#define TIMER_STOPPABLE 0x8
|
||||
//To be used with TIMER_UNIQUE
|
||||
//prevents distinguishing identical timers with the wait variable
|
||||
#define TIMER_NO_HASH_WAIT 0x10
|
||||
|
||||
#define SUBSYSTEM_DEF(X) var/datum/controller/subsystem/##X/SS##X;\
|
||||
/datum/controller/subsystem/##X/New(){\
|
||||
NEW_SS_GLOBAL(SS##X);\
|
||||
@@ -80,4 +64,4 @@
|
||||
NEW_SS_GLOBAL(SS##X);\
|
||||
PreInit();\
|
||||
}\
|
||||
/datum/controller/subsystem/processing/##X
|
||||
/datum/controller/subsystem/processing/##X
|
||||
|
||||
@@ -60,6 +60,12 @@
|
||||
#define GEAR_SECURE 1
|
||||
#define GEAR_LOOSE 2
|
||||
|
||||
//floodlights because apparently we use defines now
|
||||
#define FLOODLIGHT_NEEDS_WIRES 0
|
||||
#define FLOODLIGHT_NEEDS_LIGHTS 1
|
||||
#define FLOODLIGHT_NEEDS_SECURING 2
|
||||
#define FLOODLIGHT_NEEDS_WRENCHING 3
|
||||
|
||||
//other construction-related things
|
||||
|
||||
//windows affected by nar-sie turn this color.
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
//Timing subsystem
|
||||
//Don't run if there is an identical unique timer active
|
||||
#define TIMER_UNIQUE 0x1
|
||||
//For unique timers: Replace the old timer rather then not start this one
|
||||
#define TIMER_OVERRIDE 0x2
|
||||
//Timing should be based on how timing progresses on clients, not the sever.
|
||||
// tracking this is more expensive,
|
||||
// should only be used in conjuction with things that have to progress client side, such as animate() or sound()
|
||||
#define TIMER_CLIENT_TIME 0x4
|
||||
//Timer can be stopped using deltimer()
|
||||
#define TIMER_STOPPABLE 0x8
|
||||
//To be used with TIMER_UNIQUE
|
||||
//prevents distinguishing identical timers with the wait variable
|
||||
#define TIMER_NO_HASH_WAIT 0x10
|
||||
|
||||
//For servers that can't do with any additional lag, set this to none in flightpacks.dm in subsystem/processing.
|
||||
#define FLIGHTSUIT_PROCESSING_NONE 0
|
||||
#define FLIGHTSUIT_PROCESSING_FULL 1
|
||||
@@ -7,6 +7,8 @@
|
||||
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
|
||||
//Also allows for recursive reference searching of datums.
|
||||
//Sets world.loop_checks to false and prevents find references from sleeping
|
||||
|
||||
//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green
|
||||
#endif
|
||||
|
||||
#define PRELOAD_RSC 1 /*set to:
|
||||
|
||||
@@ -141,10 +141,9 @@
|
||||
/datum/hud/proc/show_hud(version = 0,mob/viewmob)
|
||||
if(!ismob(mymob))
|
||||
return 0
|
||||
if(!mymob.client)
|
||||
return 0
|
||||
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
if(!screenmob.client)
|
||||
return 0
|
||||
|
||||
screenmob.client.screen = list()
|
||||
|
||||
@@ -166,7 +165,7 @@
|
||||
if(infodisplay.len)
|
||||
screenmob.client.screen += infodisplay
|
||||
|
||||
mymob.client.screen += hide_actions_toggle
|
||||
screenmob.client.screen += hide_actions_toggle
|
||||
|
||||
if(action_intent)
|
||||
action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
|
||||
@@ -210,7 +209,7 @@
|
||||
mymob.update_action_buttons(1)
|
||||
reorganize_alerts()
|
||||
mymob.reload_fullscreen()
|
||||
create_parallax()
|
||||
update_parallax_pref(screenmob)
|
||||
|
||||
|
||||
/datum/hud/human/show_hud(version = 0,mob/viewmob)
|
||||
|
||||
@@ -11,9 +11,10 @@
|
||||
var/parallax_layers_max = 3
|
||||
var/parallax_animate_timer
|
||||
|
||||
/datum/hud/proc/create_parallax()
|
||||
var/client/C = mymob.client
|
||||
if (!apply_parallax_pref())
|
||||
/datum/hud/proc/create_parallax(mob/viewmob)
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
if (!apply_parallax_pref(viewmob)) //don't want shit computers to crash when specing someone with insane parallax, so use the viewer's pref
|
||||
return
|
||||
|
||||
if(!length(C.parallax_layers_cached))
|
||||
@@ -27,7 +28,10 @@
|
||||
C.parallax_layers.len = C.parallax_layers_max
|
||||
|
||||
C.screen |= (C.parallax_layers)
|
||||
var/obj/screen/plane_master/PM = plane_masters["[PLANE_SPACE]"]
|
||||
var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"]
|
||||
if(screenmob != mymob)
|
||||
C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen
|
||||
C.screen += PM
|
||||
PM.color = list(
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
@@ -37,15 +41,20 @@
|
||||
)
|
||||
|
||||
|
||||
/datum/hud/proc/remove_parallax()
|
||||
var/client/C = mymob.client
|
||||
/datum/hud/proc/remove_parallax(mob/viewmob)
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
C.screen -= (C.parallax_layers_cached)
|
||||
var/obj/screen/plane_master/PM = plane_masters["[PLANE_SPACE]"]
|
||||
var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"]
|
||||
if(screenmob != mymob)
|
||||
C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen
|
||||
C.screen += PM
|
||||
PM.color = initial(PM.color)
|
||||
C.parallax_layers = null
|
||||
|
||||
/datum/hud/proc/apply_parallax_pref()
|
||||
var/client/C = mymob.client
|
||||
/datum/hud/proc/apply_parallax_pref(mob/viewmob)
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
if(C.prefs)
|
||||
var/pref = C.prefs.parallax
|
||||
if (isnull(pref))
|
||||
@@ -75,9 +84,9 @@
|
||||
C.parallax_layers_max = 3
|
||||
return TRUE
|
||||
|
||||
/datum/hud/proc/update_parallax_pref()
|
||||
remove_parallax()
|
||||
create_parallax()
|
||||
/datum/hud/proc/update_parallax_pref(mob/viewmob)
|
||||
remove_parallax(viewmob)
|
||||
create_parallax(viewmob)
|
||||
|
||||
// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation)
|
||||
/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups)
|
||||
|
||||
@@ -240,6 +240,9 @@ SUBSYSTEM_DEF(air)
|
||||
active_turfs -= T
|
||||
if(currentpart == SSAIR_ACTIVETURFS)
|
||||
currentrun -= T
|
||||
#ifdef VISUALIZE_ACTIVE_TURFS
|
||||
T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00")
|
||||
#endif
|
||||
if(istype(T))
|
||||
T.excited = 0
|
||||
if(T.excited_group)
|
||||
@@ -247,6 +250,9 @@ SUBSYSTEM_DEF(air)
|
||||
|
||||
/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1)
|
||||
if(istype(T) && T.air)
|
||||
#ifdef VISUALIZE_ACTIVE_TURFS
|
||||
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
|
||||
#endif
|
||||
T.excited = 1
|
||||
active_turfs |= T
|
||||
if(currentpart == SSAIR_ACTIVETURFS)
|
||||
|
||||
@@ -10,6 +10,8 @@ SUBSYSTEM_DEF(atoms)
|
||||
var/initialized = INITIALIZATION_INSSATOMS
|
||||
var/old_initialized
|
||||
|
||||
var/list/late_loaders
|
||||
|
||||
/datum/controller/subsystem/atoms/Initialize(timeofday)
|
||||
fire_overlay.appearance_flags = RESET_COLOR
|
||||
setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation.
|
||||
@@ -21,8 +23,6 @@ SUBSYSTEM_DEF(atoms)
|
||||
if(initialized == INITIALIZATION_INSSATOMS)
|
||||
return
|
||||
|
||||
var/list/late_loaders
|
||||
|
||||
initialized = INITIALIZATION_INNEW_MAPLOAD
|
||||
|
||||
var/static/list/NewQdelList = list()
|
||||
@@ -68,15 +68,15 @@ SUBSYSTEM_DEF(atoms)
|
||||
|
||||
initialized = INITIALIZATION_INNEW_REGULAR
|
||||
|
||||
if(late_loaders)
|
||||
for(var/I in late_loaders)
|
||||
var/atom/A = I
|
||||
var/start_tick = world.time
|
||||
A.Initialize(FALSE)
|
||||
if(start_tick != world.time)
|
||||
WARNING("[A]: [A.type] slept during it's Initialize!")
|
||||
CHECK_TICK
|
||||
testing("Late-initialized [late_loaders.len] atoms")
|
||||
for(var/I in late_loaders)
|
||||
var/atom/A = I
|
||||
var/start_tick = world.time
|
||||
A.Initialize(FALSE)
|
||||
if(start_tick != world.time)
|
||||
WARNING("[A]: [A.type] slept during it's Initialize!")
|
||||
CHECK_TICK
|
||||
testing("Late-initialized [LAZYLEN(late_loaders)] atoms")
|
||||
LAZYCLEARLIST(late_loaders)
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/map_loader_begin()
|
||||
old_initialized = initialized
|
||||
|
||||
@@ -116,6 +116,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
INIT_ANNOUNCE("Loading [config.map_name]...")
|
||||
TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION)
|
||||
INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!")
|
||||
feedback_add_details("map_name", config.map_name)
|
||||
|
||||
if(config.minetype != "lavaland")
|
||||
INIT_ANNOUNCE("WARNING: A map without lavaland set as it's minetype was loaded! This is being ignored! Update the maploader code!")
|
||||
|
||||
@@ -5,3 +5,22 @@ PROCESSING_SUBSYSTEM_DEF(flightpacks)
|
||||
wait = 2
|
||||
stat_tag = "FM"
|
||||
flags = SS_NO_INIT|SS_TICKER|SS_KEEP_TIMING
|
||||
|
||||
var/flightsuit_processing = FLIGHTSUIT_PROCESSING_FULL
|
||||
|
||||
/datum/controller/subsystem/processing/flightpacks/Initialize()
|
||||
sync_flightsuit_processing()
|
||||
|
||||
/datum/controller/subsystem/processing/flightpacks/vv_edit_var(var_name, var_value)
|
||||
..()
|
||||
switch(var_name)
|
||||
if("flightsuit_processing")
|
||||
sync_flightsuit_processing()
|
||||
|
||||
/datum/controller/subsystem/processing/flightpacks/proc/sync_flightsuit_processing()
|
||||
for(var/obj/item/device/flightpack/FP in processing)
|
||||
FP.sync_processing(src)
|
||||
if(flightsuit_processing == FLIGHTSUIT_PROCESSING_NONE) //Don't even bother firing.
|
||||
can_fire = FALSE
|
||||
else
|
||||
can_fire = TRUE
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
defaulted = FALSE
|
||||
|
||||
#define CHECK_EXISTS(X) if(!istext(json[X])) log_world(X + "missing from json!")
|
||||
#define CHECK_EXISTS(X) if(!istext(json[X])) { log_world(X + "missing from json!"); return; }
|
||||
/datum/map_config/proc/ValidateJSON(list/json)
|
||||
CHECK_EXISTS("map_name")
|
||||
CHECK_EXISTS("map_path")
|
||||
|
||||
+4
-2
@@ -39,8 +39,10 @@
|
||||
if(do_initialize > INITIALIZATION_INSSATOMS)
|
||||
if(QDELETED(src))
|
||||
CRASH("Found new qdeletion in type [type]!")
|
||||
args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
|
||||
Initialize(arglist(args))
|
||||
var/mapload = do_initialize == INITIALIZATION_INNEW_MAPLOAD
|
||||
args[1] = mapload
|
||||
if(Initialize(arglist(args)) && mapload)
|
||||
LAZYADD(SSatoms.late_loaders, src)
|
||||
|
||||
//Called after New if the map is being loaded. mapload = TRUE
|
||||
//Called from base of New if the map is being loaded. mapload = FALSE
|
||||
|
||||
@@ -255,13 +255,11 @@
|
||||
hud_used.healths.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#e36600'>[round((health / maxHealth) * 100, 0.5)]%</font></div>"
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget()
|
||||
if(isliving(target))
|
||||
if(overmind)
|
||||
var/mob/living/L = target
|
||||
var/mob_protection = L.get_permeability_protection()
|
||||
overmind.blob_reagent_datum.reaction_mob(L, VAPOR, 20, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage.
|
||||
if(target)
|
||||
..()
|
||||
. = ..()
|
||||
if(. && isliving(target) && overmind)
|
||||
var/mob/living/L = target
|
||||
var/mob_protection = L.get_permeability_protection()
|
||||
overmind.blob_reagent_datum.reaction_mob(L, VAPOR, 20, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage.
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/update_icons()
|
||||
..()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new
|
||||
var/datum/action/innate/set_droppoint/set_droppoint_action = new
|
||||
var/obj/machinery/abductor/console/console
|
||||
z_lock = ZLEVEL_STATION
|
||||
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "camera"
|
||||
@@ -77,8 +78,7 @@
|
||||
C.client.images -= chunk.obscured
|
||||
C.remote_control = null
|
||||
C.unset_machine()
|
||||
src.Remove(C)
|
||||
|
||||
Remove(C)
|
||||
|
||||
/datum/action/innate/teleport_in
|
||||
name = "Send To"
|
||||
|
||||
@@ -168,9 +168,9 @@
|
||||
////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
|
||||
/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
|
||||
if(!isliving(target))
|
||||
target.swarmer_act(src)
|
||||
return target.swarmer_act(src)
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)
|
||||
face_atom(A)
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
if(do_after(src, 20, target = I))
|
||||
eat(I)
|
||||
return
|
||||
target.attack_animal(src)
|
||||
return ..()
|
||||
|
||||
//Spawn Event
|
||||
|
||||
|
||||
@@ -607,6 +607,9 @@
|
||||
|
||||
/obj/item/weapon/spellbook/Initialize()
|
||||
..()
|
||||
prepare_spells()
|
||||
|
||||
/obj/item/weapon/spellbook/proc/prepare_spells()
|
||||
var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon
|
||||
for(var/T in entry_types)
|
||||
var/datum/spellbook_entry/E = new T
|
||||
@@ -779,28 +782,24 @@
|
||||
desc = "This template spellbook was never meant for the eyes of man..."
|
||||
persistence_replacement = null
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/New()
|
||||
..()
|
||||
/obj/item/weapon/spellbook/oneuse/prepare_spells()
|
||||
name += spellname
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/Initialize() //No need to init
|
||||
return
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/attack_self(mob/user)
|
||||
var/obj/effect/proc_holder/spell/S = new spell
|
||||
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
|
||||
if(knownspell.type == S.type)
|
||||
if(user.mind)
|
||||
if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard")
|
||||
user <<"<span class='notice'>You're already far more versed in this spell than this flimsy how-to book can provide.</span>"
|
||||
to_chat(user,"<span class='notice'>You're already far more versed in this spell than this flimsy how-to book can provide.</span>")
|
||||
else
|
||||
user <<"<span class='notice'>You've already read this one.</span>"
|
||||
to_chat(user,"<span class='notice'>You've already read this one.</span>")
|
||||
return
|
||||
if(used)
|
||||
recoil(user)
|
||||
else
|
||||
user.mind.AddSpell(S)
|
||||
user <<"<span class='notice'>You rapidly read through the arcane book. Suddenly you realize you understand [spellname]!</span>"
|
||||
to_chat(user,"<span class='notice'>You rapidly read through the arcane book. Suddenly you realize you understand [spellname]!</span>")
|
||||
user.log_message("<font color='orange'>learned the spell [spellname] ([S]).</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
onlearned(user)
|
||||
|
||||
@@ -833,7 +832,7 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user)
|
||||
..()
|
||||
user <<"<span class='caution'>Your stomach rumbles...</span>"
|
||||
to_chat(user,"<span class='caution'>Your stomach rumbles...</span>")
|
||||
if(user.nutrition)
|
||||
user.nutrition -= 200
|
||||
if(user.nutrition <= 0)
|
||||
@@ -847,7 +846,7 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user)
|
||||
..()
|
||||
user <<"<span class='warning'>You go blind!</span>"
|
||||
to_chat(user,"<span class='warning'>You go blind!</span>")
|
||||
user.blind_eyes(10)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap
|
||||
@@ -869,17 +868,17 @@
|
||||
stored_swap = null
|
||||
if(!stored_swap)
|
||||
stored_swap = user
|
||||
user <<"<span class='warning'>For a moment you feel like you don't even know who you are anymore.</span>"
|
||||
to_chat(user,"<span class='warning'>For a moment you feel like you don't even know who you are anymore.</span>")
|
||||
return
|
||||
if(stored_swap == user)
|
||||
user <<"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>"
|
||||
to_chat(user,"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new
|
||||
swapper.cast(user, stored_swap, 1)
|
||||
|
||||
stored_swap <<"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>"
|
||||
user <<"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>"
|
||||
to_chat(stored_swap,"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>")
|
||||
to_chat(user,"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>")
|
||||
stored_swap = null
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/forcewall
|
||||
@@ -890,7 +889,7 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user)
|
||||
..()
|
||||
user <<"<span class='warning'>You suddenly feel very solid!</span>"
|
||||
to_chat(user,"<span class='warning'>You suddenly feel very solid!</span>")
|
||||
user.Stun(2)
|
||||
user.petrify(30)
|
||||
|
||||
@@ -902,7 +901,7 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user)
|
||||
..()
|
||||
user <<"<span class='warning'>You're knocked down!</span>"
|
||||
to_chat(user,"<span class='warning'>You're knocked down!</span>")
|
||||
user.Weaken(20)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/barnyard
|
||||
@@ -913,7 +912,7 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/barnyard/recoil(mob/living/carbon/user)
|
||||
if(ishuman(user))
|
||||
user <<"<font size='15' color='red'><b>HOR-SIE HAS RISEN</b></font>"
|
||||
to_chat(user,"<font size='15' color='red'><b>HOR-SIE HAS RISEN</b></font>")
|
||||
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
|
||||
magichead.flags |= NODROP //curses!
|
||||
magichead.flags_inv &= ~HIDEFACE //so you can still see their face
|
||||
@@ -923,7 +922,7 @@
|
||||
user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user <<"<span class='notice'>I say thee neigh</span>" //It still lives here
|
||||
to_chat(user,"<span class='notice'>I say thee neigh</span>") //It still lives here
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/charge
|
||||
spell = /obj/effect/proc_holder/spell/targeted/charge
|
||||
@@ -933,7 +932,7 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user)
|
||||
..()
|
||||
user <<"<span class='warning'>[src] suddenly feels very warm!</span>"
|
||||
to_chat(user,"<span class='warning'>[src] suddenly feels very warm!</span>")
|
||||
empulse(src, 1, 1)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/summonitem
|
||||
@@ -944,10 +943,11 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/summonitem/recoil(mob/user)
|
||||
..()
|
||||
user <<"<span class='warning'>[src] suddenly vanishes!</span>"
|
||||
to_chat(user,"<span class='warning'>[src] suddenly vanishes!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/random/New()
|
||||
/obj/item/weapon/spellbook/oneuse/random/Initialize()
|
||||
..()
|
||||
var/static/banned_spells = list(/obj/item/weapon/spellbook/oneuse/mimery_blockade,/obj/item/weapon/spellbook/oneuse/mimery_guns)
|
||||
var/real_type = pick(subtypesof(/obj/item/weapon/spellbook/oneuse) - banned_spells)
|
||||
new real_type(loc)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Used to access the various cameras on the station."
|
||||
icon_screen = "cameras"
|
||||
icon_keyboard = "security_key"
|
||||
var/z_lock = null // Lock use to this zlevel
|
||||
var/mob/camera/aiEye/remote/eyeobj
|
||||
var/mob/living/current_user = null
|
||||
var/list/networks = list("SS13")
|
||||
@@ -50,13 +51,13 @@
|
||||
if(!eyeobj.eye_initialized)
|
||||
var/camera_location
|
||||
for(var/obj/machinery/camera/C in cameranet.cameras)
|
||||
if(!C.can_use())
|
||||
if(!C.can_use() || z_lock && C.z != z_lock)
|
||||
continue
|
||||
if(C.network&networks)
|
||||
if(C.network & networks)
|
||||
camera_location = get_turf(C)
|
||||
break
|
||||
if(camera_location)
|
||||
eyeobj.eye_initialized = 1
|
||||
eyeobj.eye_initialized = TRUE
|
||||
give_eye_control(L)
|
||||
eyeobj.setLoc(camera_location)
|
||||
else
|
||||
@@ -79,6 +80,7 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
|
||||
eyeobj.name = "Camera Eye ([user.name])"
|
||||
user.remote_control = eyeobj
|
||||
user.reset_perspective(eyeobj)
|
||||
eyeobj.setLoc(eyeobj.loc)
|
||||
|
||||
/mob/camera/aiEye/remote
|
||||
name = "Inactive Camera Eye"
|
||||
@@ -124,7 +126,7 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
|
||||
for(var/i = 0; i < max(sprint, initial); i += 20)
|
||||
var/turf/step = get_turf(get_step(src, direct))
|
||||
if(step)
|
||||
src.setLoc(step)
|
||||
setLoc(step)
|
||||
|
||||
cooldown = world.timeofday + 5
|
||||
if(acceleration)
|
||||
@@ -152,7 +154,7 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
|
||||
C.client.images -= chunk.obscured
|
||||
C.remote_control = null
|
||||
C.unset_machine()
|
||||
src.Remove(C)
|
||||
Remove(C)
|
||||
playsound(remote_eye.origin, 'sound/machines/terminal_off.ogg', 25, 0)
|
||||
|
||||
/datum/action/innate/camera_jump
|
||||
@@ -169,6 +171,8 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
|
||||
var/list/L = list()
|
||||
|
||||
for (var/obj/machinery/camera/cam in cameranet.cameras)
|
||||
if(origin.z_lock && cam.z != origin.z_lock)
|
||||
continue
|
||||
L.Add(cam)
|
||||
|
||||
camera_sort(L)
|
||||
@@ -176,10 +180,9 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
|
||||
var/list/T = list()
|
||||
|
||||
for (var/obj/machinery/camera/netcam in L)
|
||||
var/list/tempnetwork = netcam.network&origin.networks
|
||||
var/list/tempnetwork = netcam.network & origin.networks
|
||||
if (tempnetwork.len)
|
||||
T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam
|
||||
|
||||
T["[netcam.c_tag][netcam.can_use() ? null : " (Deactivated)"]"] = netcam
|
||||
|
||||
playsound(origin, 'sound/machines/terminal_prompt.ogg', 25, 0)
|
||||
var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/countdown_colour
|
||||
var/obj/effect/countdown/anomaly/countdown
|
||||
|
||||
/obj/effect/anomaly/New()
|
||||
/obj/effect/anomaly/Initialize(mapload, new_lifespan)
|
||||
..()
|
||||
poi_list |= src
|
||||
START_PROCESSING(SSobj, src)
|
||||
@@ -31,6 +31,8 @@
|
||||
if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven!
|
||||
aSignal.frequency++
|
||||
|
||||
if(new_lifespan)
|
||||
lifespan = new_lifespan
|
||||
death_time = world.time + lifespan
|
||||
countdown = new(src)
|
||||
if(countdown_colour)
|
||||
@@ -126,7 +128,7 @@
|
||||
density = 1
|
||||
var/canshock = 0
|
||||
var/shockdamage = 20
|
||||
var/explosive = 1
|
||||
var/explosive = TRUE
|
||||
|
||||
/obj/effect/anomaly/flux/New()
|
||||
..()
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
|
||||
var/mergeable_decal = 1 //when two of these are on a same tile or do we need to merge them into just one?
|
||||
|
||||
/obj/effect/decal/cleanable/New()
|
||||
/obj/effect/decal/cleanable/Initialize(mapload)
|
||||
if (random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
create_reagents(300)
|
||||
@@ -88,4 +88,4 @@
|
||||
if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
|
||||
return bloodiness
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -54,4 +54,10 @@
|
||||
icon_state = "bot"
|
||||
|
||||
/obj/effect/turf_decal/loading_area
|
||||
icon_state = "loading_area"
|
||||
icon_state = "loading_area"
|
||||
|
||||
/obj/effect/turf_decal/sand
|
||||
icon_state = "sandyfloor"
|
||||
|
||||
/obj/effect/turf_decal/sand/plating
|
||||
icon_state = "sandyplating"
|
||||
@@ -73,6 +73,8 @@
|
||||
|
||||
/obj/effect/particle_effect/smoke/proc/spread_smoke()
|
||||
var/turf/t_loc = get_turf(src)
|
||||
if(!t_loc)
|
||||
return
|
||||
var/list/newsmokes = list()
|
||||
for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
|
||||
var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke!
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
/obj/item/clothing/gloves/color/fyellow = 1,
|
||||
/obj/item/clothing/head/hardhat = 1,
|
||||
/obj/item/clothing/head/hardhat/red = 1,
|
||||
/obj/item/clothing/head/that{throwforce = 1;} = 1,
|
||||
/obj/item/clothing/head/that = 1,
|
||||
/obj/item/clothing/head/ushanka = 1,
|
||||
/obj/item/clothing/head/welding = 1,
|
||||
/obj/item/clothing/mask/gas = 15,
|
||||
@@ -105,8 +105,8 @@
|
||||
/obj/item/device/radio/off = 2,
|
||||
/obj/item/device/t_scanner = 5,
|
||||
/obj/item/weapon/airlock_painter = 1,
|
||||
/obj/item/stack/cable_coil = 4,
|
||||
/obj/item/stack/cable_coil{amount = 5} = 6,
|
||||
/obj/item/stack/cable_coil/random = 4,
|
||||
/obj/item/stack/cable_coil/random{amount = 5} = 6,
|
||||
/obj/item/stack/medical/bruise_pack = 1,
|
||||
/obj/item/stack/rods{amount = 10} = 9,
|
||||
/obj/item/stack/rods{amount = 23} = 1,
|
||||
|
||||
@@ -42,17 +42,17 @@
|
||||
/obj/item/robot_suit/proc/updateicon()
|
||||
cut_overlays()
|
||||
if(l_arm)
|
||||
add_overlay("l_arm+o")
|
||||
add_overlay("[l_arm.icon_state]+o")
|
||||
if(r_arm)
|
||||
add_overlay("r_arm+o")
|
||||
add_overlay("[r_arm.icon_state]+o")
|
||||
if(chest)
|
||||
add_overlay("chest+o")
|
||||
add_overlay("[chest.icon_state]+o")
|
||||
if(l_leg)
|
||||
add_overlay("l_leg+o")
|
||||
add_overlay("[l_leg.icon_state]+o")
|
||||
if(r_leg)
|
||||
add_overlay("r_leg+o")
|
||||
add_overlay("[r_leg.icon_state]+o")
|
||||
if(head)
|
||||
add_overlay("head+o")
|
||||
add_overlay("[head.icon_state]+o")
|
||||
|
||||
/obj/item/robot_suit/proc/check_completion()
|
||||
if(src.l_arm && src.r_arm)
|
||||
|
||||
@@ -51,6 +51,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/metal
|
||||
|
||||
@@ -36,9 +36,13 @@
|
||||
|
||||
|
||||
/obj/structure/closet/Initialize(mapload)
|
||||
..()
|
||||
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
|
||||
. = TRUE //late initialize so we come back here
|
||||
else if(initialized)
|
||||
//we were late initialized, so now it's time to...
|
||||
take_contents()
|
||||
return
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/closet/Destroy()
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
new /obj/item/weapon/storage/belt/medical(src)
|
||||
new /obj/item/device/assembly/flash/handheld(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/CMO(src)
|
||||
new /obj/item/device/autoimplanter/cmo(src)
|
||||
new /obj/item/device/autosurgeon/cmo(src)
|
||||
new /obj/item/weapon/door_remote/chief_medical_officer(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/animal
|
||||
|
||||
@@ -134,6 +134,11 @@
|
||||
Cargo(<b>brown</b>), Science(<b>purple</b>), Escape(<b>red and white</b>), and Medbay(<b>blue</b>).\nIn the center of the station, you see the Bridge(<b>dark blue</b>).\n\
|
||||
Around those, you see Hallways/Entrances(<b>light grey</b>), Public Areas(<b>grey</b>), and Maintenance(<b>dark grey</b>)."
|
||||
|
||||
/obj/structure/sign/map/left/ceres
|
||||
icon_state = "map-CS"
|
||||
desc = "A framed picture of the station.\nClockwise from the top, you see Security (<b>red</b>), Dorms (<b>light-green</b>), Bridge (<b>dark-blue</b>), AI Core (<b>gray</b>), \
|
||||
Cargo (<b>brown</b>), Medbay (<b>blue</b>), Arrivals/Departures(<b>orange/cyan</b>), Research (<b>purple</b>), Service (<b>dark-green</b>), and Engineering in the center (<b>yellow</b>)."
|
||||
|
||||
/obj/structure/sign/securearea
|
||||
name = "\improper SECURE AREA"
|
||||
desc = "A warning sign which reads 'SECURE AREA'."
|
||||
@@ -241,6 +246,11 @@
|
||||
desc = "A sign labelling an area as a place where xenobiological entities are researched."
|
||||
icon_state = "xenobio"
|
||||
|
||||
/obj/structure/sign/enginesafety
|
||||
name = "\improper ENGINEERING SAFETY"
|
||||
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
|
||||
icon_state = "safety"
|
||||
|
||||
/obj/structure/sign/directions/science
|
||||
name = "science department"
|
||||
desc = "A direction sign, pointing out which way the Science department is."
|
||||
@@ -265,3 +275,13 @@
|
||||
name = "escape arm"
|
||||
desc = "A direction sign, pointing out which way the escape shuttle dock is."
|
||||
icon_state = "direction_evac"
|
||||
|
||||
/obj/structure/sign/directions/supply
|
||||
name = "cargo bay"
|
||||
desc = "A direction sign, pointing out which way the Cargo Bay is."
|
||||
icon_state = "direction_supply"
|
||||
|
||||
/obj/structure/sign/directions/command
|
||||
name = "command department"
|
||||
desc = "A direction sign, pointing out which way the Command department is."
|
||||
icon_state = "direction_bridge"
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
I = organ
|
||||
I.removed(C)
|
||||
|
||||
organ.loc = get_turf(C)
|
||||
organ.forceMove(get_turf(C))
|
||||
|
||||
if(operation == "remove organ/implant")
|
||||
qdel(organ)
|
||||
@@ -55,4 +55,4 @@
|
||||
var/obj/item/weapon/implantcase/case = new(get_turf(C))
|
||||
case.imp = I
|
||||
I.loc = case
|
||||
case.update_icon()
|
||||
case.update_icon()
|
||||
|
||||
@@ -1210,12 +1210,12 @@ var/list/preferences_datums = list()
|
||||
if("parallaxup")
|
||||
parallax = Wrap(parallax + 1, PARALLAX_INSANE, PARALLAX_DISABLE + 1)
|
||||
if (parent && parent.mob && parent.mob.hud_used)
|
||||
parent.mob.hud_used.update_parallax_pref()
|
||||
parent.mob.hud_used.update_parallax_pref(parent.mob)
|
||||
|
||||
if("parallaxdown")
|
||||
parallax = Wrap(parallax - 1, PARALLAX_INSANE, PARALLAX_DISABLE + 1)
|
||||
if (parent && parent.mob && parent.mob.hud_used)
|
||||
parent.mob.hud_used.update_parallax_pref()
|
||||
parent.mob.hud_used.update_parallax_pref(parent.mob)
|
||||
|
||||
if("save")
|
||||
save_preferences()
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
icon_state = "tophat"
|
||||
item_state = "that"
|
||||
dog_fashion = /datum/dog_fashion/head
|
||||
throwforce = 1
|
||||
|
||||
/obj/item/clothing/head/canada
|
||||
name = "striped red tophat"
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
slot_flags = SLOT_BACK
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
var/processing_mode = FLIGHTSUIT_PROCESSING_FULL
|
||||
|
||||
var/obj/item/clothing/suit/space/hardsuit/flightsuit/suit = null
|
||||
var/mob/living/carbon/human/wearer = null
|
||||
var/slowdown_ground = 1
|
||||
@@ -104,14 +106,15 @@
|
||||
|
||||
|
||||
//Start/Stop processing the item to use momentum and flight mechanics.
|
||||
/obj/item/device/flightpack/New()
|
||||
/obj/item/device/flightpack/Initialize()
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
START_PROCESSING(SSflightpacks, src)
|
||||
..()
|
||||
update_parts()
|
||||
sync_processing(SSflightpacks)
|
||||
..()
|
||||
|
||||
/obj/item/device/flightpack/full/New()
|
||||
/obj/item/device/flightpack/full/Initialize()
|
||||
part_manip = new /obj/item/weapon/stock_parts/manipulator/pico(src)
|
||||
part_scan = new /obj/item/weapon/stock_parts/scanning_module/phasic(src)
|
||||
part_cap = new /obj/item/weapon/stock_parts/capacitor/super(src)
|
||||
@@ -120,6 +123,18 @@
|
||||
assembled = TRUE
|
||||
..()
|
||||
|
||||
/obj/item/device/flightpack/proc/sync_processing(datum/controller/subsystem/processing/flightpacks/FPS)
|
||||
processing_mode = FPS.flightsuit_processing
|
||||
if(processing_mode == FLIGHTSUIT_PROCESSING_NONE)
|
||||
momentum_x = 0
|
||||
momentum_y = 0
|
||||
momentum_speed_x = 0
|
||||
momentum_speed_y = 0
|
||||
momentum_speed = 0
|
||||
boost_charge = 0
|
||||
boost = FALSE
|
||||
update_slowdown()
|
||||
|
||||
/obj/item/device/flightpack/proc/update_parts()
|
||||
boost_chargerate = initial(boost_chargerate)
|
||||
boost_drain = initial(boost_drain)
|
||||
@@ -339,7 +354,7 @@
|
||||
suit.slowdown = slowdown_air
|
||||
|
||||
/obj/item/device/flightpack/process()
|
||||
if(!suit)
|
||||
if(!suit || (processing_mode == FLIGHTSUIT_PROCESSING_NONE))
|
||||
return FALSE
|
||||
update_slowdown()
|
||||
update_icon()
|
||||
@@ -451,7 +466,7 @@
|
||||
wearer.visible_message("[wearer] is knocked flying by the impact!")
|
||||
|
||||
/obj/item/device/flightpack/proc/flight_impact(atom/unmovablevictim, crashdir) //Yes, victim.
|
||||
if((unmovablevictim == wearer) || crashing)
|
||||
if((unmovablevictim == wearer) || crashing || (processing_mode == FLIGHTSUIT_PROCESSING_NONE))
|
||||
return FALSE
|
||||
crashing = TRUE
|
||||
var/crashpower = 0
|
||||
|
||||
@@ -308,3 +308,33 @@ Contains:
|
||||
desc = "Peering into the eyes of the helmet is enough to seal damnation."
|
||||
icon_state = "hardsuit0-beserker"
|
||||
item_state = "hardsuit0-beserker"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/fragile
|
||||
name = "emergency space helmet"
|
||||
desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable."
|
||||
icon_state = "syndicate-helm-orange"
|
||||
item_state = "syndicate-helm-orange"
|
||||
armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10, fire = 0, acid = 0)
|
||||
strip_delay = 65
|
||||
|
||||
/obj/item/clothing/suit/space/fragile
|
||||
name = "emergency space suit"
|
||||
desc = "A bulky, air-tight suit meant to protect the user during emergency situations. It doesn't look very durable."
|
||||
var/torn = FALSE
|
||||
icon_state = "syndicate-orange"
|
||||
item_state = "syndicate-orange"
|
||||
slowdown = 2
|
||||
armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10, fire = 0, acid = 0)
|
||||
strip_delay = 65
|
||||
|
||||
/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
|
||||
if(!torn && prob(50))
|
||||
to_chat(owner, "<span class='warning'>[src] tears from the damage, breaking the air-tight seal!</span>")
|
||||
src.flags -= STOPSPRESSUREDMAGE
|
||||
src.name = "torn [src]."
|
||||
src.desc = "A bulky suit meant to protect the user during emergency situations, at least until someone tore a hole in the suit."
|
||||
src.torn = TRUE
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1)
|
||||
playsound(loc, 'sound/effects/refill.ogg', 50, 1)
|
||||
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id], 1), list("blood_type"="O-"))
|
||||
continue
|
||||
|
||||
T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id]), 1)
|
||||
T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id],1))
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT)
|
||||
CollectOre()
|
||||
return
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
|
||||
var/obj/item/weapon/ore/O
|
||||
|
||||
@@ -805,7 +805,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(mob_eye.hud_used)
|
||||
LAZYINITLIST(mob_eye.observers)
|
||||
mob_eye.observers |= src
|
||||
mob_eye.hud_used.show_hud(1,src)
|
||||
mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src)
|
||||
observetarget = mob_eye
|
||||
|
||||
/mob/dead/observer/verb/register_pai_candidate()
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/datum/emote/brain/flash
|
||||
key = "flash"
|
||||
message = "lights' blink."
|
||||
message = "blinks their lights."
|
||||
|
||||
/datum/emote/brain/notice
|
||||
key = "notice"
|
||||
|
||||
@@ -74,7 +74,8 @@ In all, this is a lot like the monkey code. /N
|
||||
|
||||
|
||||
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
switch(M.melee_damage_type)
|
||||
if(BRUTE)
|
||||
@@ -89,7 +90,6 @@ In all, this is a lot like the monkey code. /N
|
||||
adjustCloneLoss(damage)
|
||||
if(STAMINA)
|
||||
adjustStaminaLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M)
|
||||
if(..()) //successful slime attack
|
||||
|
||||
@@ -302,13 +302,14 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration))
|
||||
return 0
|
||||
return FALSE
|
||||
var/dam_zone = dismembering_strike(M, pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
|
||||
if(!dam_zone) //Dismemberment successful
|
||||
return 1
|
||||
return TRUE
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart("chest")
|
||||
|
||||
@@ -138,11 +138,12 @@
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
var/dam_zone = dismembering_strike(M, pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
|
||||
if(!dam_zone) //Dismemberment successful
|
||||
return 1
|
||||
return TRUE
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart("chest")
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
"<span class='userdanger'>[M] took a swipe at [src]!</span>")
|
||||
|
||||
/mob/living/silicon/attack_animal(mob/living/simple_animal/M)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
if(prob(damage))
|
||||
for(var/mob/living/N in buckled_mobs)
|
||||
@@ -44,7 +45,6 @@
|
||||
adjustCloneLoss(damage)
|
||||
if(STAMINA)
|
||||
adjustStaminaLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/attack_paw(mob/living/user)
|
||||
return attack_hand(user)
|
||||
|
||||
@@ -60,25 +60,25 @@
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L)
|
||||
if(..() && stat != DEAD) //successful larva bite
|
||||
. = ..()
|
||||
if(. && stat != DEAD) //successful larva bite
|
||||
var/damage = rand(5, 10)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
attack_threshold_check(damage)
|
||||
return 1
|
||||
. = attack_threshold_check(damage)
|
||||
if(.)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
|
||||
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
attack_threshold_check(damage, M.melee_damage_type)
|
||||
return 1
|
||||
return attack_threshold_check(damage, M.melee_damage_type)
|
||||
|
||||
/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M)
|
||||
if(..()) //successful slime attack
|
||||
var/damage = rand(15, 25)
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 35)
|
||||
attack_threshold_check(damage)
|
||||
return 1
|
||||
return attack_threshold_check(damage)
|
||||
|
||||
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee")
|
||||
var/temp_damage = damage
|
||||
@@ -89,8 +89,10 @@
|
||||
|
||||
if(temp_damage >= 0 && temp_damage <= force_threshold)
|
||||
visible_message("<span class='warning'>[src] looks unharmed.</span>")
|
||||
return FALSE
|
||||
else
|
||||
apply_damage(damage, damagetype, null, getarmor(null, armorcheck))
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
|
||||
@@ -338,7 +338,7 @@
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/proc/assess_patient(mob/living/carbon/C)
|
||||
//Time to see if they need medical help!
|
||||
if(C.stat == 2)
|
||||
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
|
||||
return 0 //welp too late for them!
|
||||
|
||||
if(C.suiciding)
|
||||
@@ -404,7 +404,7 @@
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
if(C.stat == 2)
|
||||
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
|
||||
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg',"Live, damnit! LIVE!" = 'sound/voice/mlive.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
else
|
||||
to_chat(M, "<span class='cult'>You cannot repair your own dents, as you have none!</span>")
|
||||
else if(src != M)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
|
||||
@@ -36,5 +36,6 @@
|
||||
qdel(target) //Nom
|
||||
target = null
|
||||
adjustBruteLoss(-2)
|
||||
return TRUE
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
@@ -183,12 +183,11 @@ var/global/list/parasites = list() //all currently existing/living guardians
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/AttackingTarget()
|
||||
if(src.loc == summoner)
|
||||
if(loc == summoner)
|
||||
to_chat(src, "<span class='danger'><B>You must be manifested to attack!</span></B>")
|
||||
return 0
|
||||
return FALSE
|
||||
else
|
||||
..()
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/death()
|
||||
drop_all_held_items()
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
|
||||
ToggleMode(1)
|
||||
|
||||
|
||||
@@ -17,19 +17,18 @@
|
||||
stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget()
|
||||
if(..())
|
||||
if(prob(40))
|
||||
if(isliving(target))
|
||||
var/mob/living/M = target
|
||||
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
|
||||
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
|
||||
do_teleport(M, M, 10)
|
||||
for(var/mob/living/L in range(1, M))
|
||||
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
|
||||
continue
|
||||
if(L != src && L != summoner)
|
||||
L.apply_damage(15, BRUTE)
|
||||
new /obj/effect/overlay/temp/explosion(get_turf(M))
|
||||
. = ..()
|
||||
if(. && prob(40) && isliving(target))
|
||||
var/mob/living/M = target
|
||||
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
|
||||
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
|
||||
do_teleport(M, M, 10)
|
||||
for(var/mob/living/L in range(1, M))
|
||||
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
|
||||
continue
|
||||
if(L != src && L != summoner)
|
||||
L.apply_damage(15, BRUTE)
|
||||
new /obj/effect/overlay/temp/explosion(get_turf(M))
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
|
||||
if(!istype(A))
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
summoner.adjust_fire_stacks(-20)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
|
||||
if(..())
|
||||
if(ishuman(target) && target != summoner)
|
||||
new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
|
||||
. = ..()
|
||||
if(. && ishuman(target) && target != summoner)
|
||||
new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
|
||||
..()
|
||||
|
||||
@@ -20,18 +20,18 @@
|
||||
var/successfulshocks = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/beam/AttackingTarget()
|
||||
if(..())
|
||||
if(isliving(target) && target != src && target != summoner)
|
||||
cleardeletedchains()
|
||||
for(var/chain in enemychains)
|
||||
var/datum/beam/B = chain
|
||||
if(B.target == target)
|
||||
return //oh this guy already HAS a chain, let's not chain again
|
||||
if(enemychains.len > 2)
|
||||
var/datum/beam/C = pick(enemychains)
|
||||
qdel(C)
|
||||
enemychains -= C
|
||||
enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain)
|
||||
. = ..()
|
||||
if(. && isliving(target) && target != src && target != summoner)
|
||||
cleardeletedchains()
|
||||
for(var/chain in enemychains)
|
||||
var/datum/beam/B = chain
|
||||
if(B.target == target)
|
||||
return //oh this guy already HAS a chain, let's not chain again
|
||||
if(enemychains.len > 2)
|
||||
var/datum/beam/C = pick(enemychains)
|
||||
qdel(C)
|
||||
enemychains -= C
|
||||
enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/beam/Destroy()
|
||||
removechains()
|
||||
|
||||
@@ -22,10 +22,10 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
|
||||
. = ..()
|
||||
if(isliving(target))
|
||||
src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]!!")
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
..()
|
||||
|
||||
@@ -27,21 +27,20 @@
|
||||
stat(null, "Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
|
||||
if(..())
|
||||
if(toggle == TRUE)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.adjustBruteLoss(-5)
|
||||
C.adjustFireLoss(-5)
|
||||
C.adjustOxyLoss(-5)
|
||||
C.adjustToxLoss(-5)
|
||||
var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
|
||||
if(namedatum)
|
||||
H.color = namedatum.colour
|
||||
if(C == summoner)
|
||||
update_health_hud()
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
. = ..()
|
||||
if(. && toggle && iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.adjustBruteLoss(-5)
|
||||
C.adjustFireLoss(-5)
|
||||
C.adjustOxyLoss(-5)
|
||||
C.adjustToxLoss(-5)
|
||||
var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
|
||||
if(namedatum)
|
||||
H.color = namedatum.colour
|
||||
if(C == summoner)
|
||||
update_health_hud()
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
|
||||
if(src.loc == summoner)
|
||||
|
||||
@@ -169,7 +169,8 @@
|
||||
if(istype(target, /obj/effect/decal/cleanable))
|
||||
visible_message("[src] cleans up \the [target].")
|
||||
qdel(target)
|
||||
return
|
||||
return TRUE
|
||||
var/atom/movable/M = target
|
||||
M.clean_blood()
|
||||
visible_message("[src] polishes \the [target].")
|
||||
return TRUE
|
||||
|
||||
@@ -144,12 +144,12 @@
|
||||
target = null
|
||||
wanted_objects -= typecacheof(/obj/structure/beebox) //so we don't attack beeboxes when not going home
|
||||
else
|
||||
if(beegent && isliving(target))
|
||||
. = ..()
|
||||
if(. && beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.reagents)
|
||||
beegent.reaction_mob(L, INJECT)
|
||||
L.reagents.add_reagent(beegent.id, rand(1,5))
|
||||
target.attack_animal(src)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
|
||||
@@ -228,11 +228,11 @@
|
||||
|
||||
//leave pollination for the peasent bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget()
|
||||
if(beegent && isliving(target))
|
||||
. = ..()
|
||||
if(. && beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
beegent.reaction_mob(L, TOUCH)
|
||||
L.reagents.add_reagent(beegent.id, rand(1,5))
|
||||
target.attack_animal(src)
|
||||
|
||||
|
||||
//PEASENT BEES
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
return 1 //No drifting in space for space carp! //original comments do not steal
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/AttackingTarget()
|
||||
..()
|
||||
if(ishuman(target))
|
||||
. = ..()
|
||||
if(. && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.adjustStaminaLoss(8)
|
||||
|
||||
|
||||
@@ -36,10 +36,9 @@
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
|
||||
..()
|
||||
if(iscarbon(target))
|
||||
. = ..()
|
||||
if(. && prob(12) && iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(prob(12))
|
||||
C.Weaken(3)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
C.Weaken(3)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
@@ -9,8 +9,8 @@
|
||||
var/poison_type = "toxin"
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/AttackingTarget()
|
||||
..()
|
||||
if(isliving(target))
|
||||
. = ..()
|
||||
if(. && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
@@ -38,10 +38,8 @@
|
||||
egg_lain = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/AttackingTarget()
|
||||
if(egg_lain)
|
||||
target.attack_animal(src)
|
||||
return
|
||||
if(iscarbon(target) && !ismonkey(target))
|
||||
. = ..()
|
||||
if(. && !egg_lain && iscarbon(target) && !ismonkey(target))
|
||||
// Changeling egg can survive in aliens!
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.stat == DEAD)
|
||||
@@ -50,13 +48,7 @@
|
||||
return
|
||||
Infect(target)
|
||||
to_chat(src, "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>")
|
||||
spawn(100)
|
||||
death()
|
||||
return
|
||||
target.attack_animal(src)
|
||||
|
||||
|
||||
|
||||
addtimer(CALLBACK(src, .proc/death), 100)
|
||||
|
||||
/obj/item/organ/body_egg/changeling_egg
|
||||
name = "changeling egg"
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/AttackingTarget()
|
||||
target.attack_animal(src)
|
||||
return target.attack_animal(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/Aggro()
|
||||
vision_range = aggro_vision_range
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/AttackingTarget()
|
||||
..()
|
||||
if(isliving(target) && prob(multiply_chance))
|
||||
. = ..()
|
||||
if(. && isliving(target) && prob(multiply_chance))
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
return
|
||||
@@ -71,4 +71,4 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
|
||||
return
|
||||
return FALSE
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
target = null
|
||||
return
|
||||
|
||||
target.attack_animal(src)
|
||||
return target.attack_animal(src)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
|
||||
|
||||
@@ -108,7 +108,7 @@ Difficulty: Hard
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in mob_list)
|
||||
if(B != src)
|
||||
qdel(src) //There can be only one
|
||||
break
|
||||
return
|
||||
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
|
||||
AddSpell(bloodspell)
|
||||
if(istype(loc, /obj/effect/dummy/slaughter))
|
||||
@@ -126,7 +126,7 @@ Difficulty: Hard
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
|
||||
if(!charging)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance)
|
||||
if(!charging)
|
||||
|
||||
@@ -639,7 +639,7 @@ Difficulty: Very Hard
|
||||
medsensor.add_hud_to(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/lightgeist/AttackingTarget()
|
||||
..()
|
||||
. = ..()
|
||||
if(isliving(target) && target != src)
|
||||
var/mob/living/L = target
|
||||
if(L.stat < DEAD)
|
||||
|
||||
@@ -69,7 +69,7 @@ Difficulty: Medium
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
|
||||
if(!swooping)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/DestroySurroundings()
|
||||
if(!swooping)
|
||||
|
||||
@@ -139,7 +139,7 @@ Difficulty: Hard
|
||||
if(!blinking)
|
||||
if(target && isliving(target))
|
||||
INVOKE_ASYNC(src, .proc/melee_blast, get_turf(target)) //melee attacks on living mobs produce a 3x3 blast
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/hierophant/DestroySurroundings()
|
||||
if(!blinking)
|
||||
|
||||
@@ -55,8 +55,8 @@ Difficulty: Medium
|
||||
internal = new/obj/item/device/gps/internal/legion(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget()
|
||||
..()
|
||||
if(ishuman(target))
|
||||
. = ..()
|
||||
if(. && ishuman(target))
|
||||
var/mob/living/L = target
|
||||
if(L.stat == UNCONSCIOUS)
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
|
||||
|
||||
@@ -71,8 +71,8 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/AttackingTarget()
|
||||
..()
|
||||
if(isliving(target))
|
||||
. = ..()
|
||||
if(. && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.stat != DEAD)
|
||||
if(!client && ranged && ranged_cooldown <= world.time)
|
||||
|
||||
@@ -214,8 +214,10 @@ var/global/list/AISwarmerCapsByType = list(/mob/living/simple_animal/hostile/swa
|
||||
/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget()
|
||||
if(target.swarmer_act(src))
|
||||
add_type_to_wanted(target.type)
|
||||
return TRUE
|
||||
else
|
||||
add_type_to_ignore(target.type)
|
||||
return FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action()
|
||||
@@ -308,8 +310,9 @@ var/global/list/AISwarmerCapsByType = list(/mob/living/simple_animal/hostile/swa
|
||||
var/mob/living/L = target
|
||||
L.attack_animal(src)
|
||||
L.electrocute_act(10, src, safety = TRUE) //safety = TRUE means we don't check gloves... Ok?
|
||||
return TRUE
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +66,11 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
icon_state = initial(icon_state)
|
||||
if(prob(15) && iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.Weaken(2)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/crate/proc/trigger()
|
||||
if(!attempt_open)
|
||||
@@ -87,18 +92,6 @@
|
||||
O.loc = C
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget()
|
||||
. =..()
|
||||
var/mob/living/L = .
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(prob(15))
|
||||
C.Weaken(2)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
|
||||
|
||||
|
||||
var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window)
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy
|
||||
@@ -178,14 +171,12 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/AttackingTarget()
|
||||
..()
|
||||
if(knockdown_people)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(prob(15))
|
||||
C.Weaken(2)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
. = ..()
|
||||
if(knockdown_people && . && prob(15) && iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.Weaken(2)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/Aggro()
|
||||
..()
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
if(istype(target, /obj/item/weapon/ore))
|
||||
EatOre(target)
|
||||
return
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/targeted_ore)
|
||||
for(var/obj/item/weapon/ore/O in targeted_ore.loc)
|
||||
@@ -233,6 +233,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
|
||||
OpenFire()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
|
||||
mouse_opacity = 1
|
||||
@@ -360,8 +361,8 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/AttackingTarget()
|
||||
..()
|
||||
if(iscarbon(target))
|
||||
. = ..()
|
||||
if(. && iscarbon(target))
|
||||
transfer_reagents(target, 1)
|
||||
|
||||
|
||||
@@ -924,7 +925,7 @@
|
||||
regenerate_icons()
|
||||
visible_message("<span class='notice'>[src] slurps up [target].</span>")
|
||||
qdel(target)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/udder/gutlunch
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
if(faint_ticker < 2)
|
||||
M.visible_message("[M] chews a bit on [src].")
|
||||
faint_ticker++
|
||||
return
|
||||
return TRUE
|
||||
M.visible_message("<span class='warning'>[M] devours [src]!</span>")
|
||||
var/level_gain = (powerlevel - M.powerlevel)
|
||||
if(level_gain >= -1 && !bruised && !M.ckey)//Player shrooms can't level up to become robust gods.
|
||||
@@ -86,7 +86,8 @@
|
||||
M.LevelUp(level_gain)
|
||||
M.adjustBruteLoss(-M.maxHealth)
|
||||
qdel(src)
|
||||
..()
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/revive(full_heal = 0, admin_revive = 0)
|
||||
if(..())
|
||||
|
||||
@@ -93,9 +93,9 @@
|
||||
if(can_be_seen(get_turf(loc)))
|
||||
if(client)
|
||||
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
|
||||
return
|
||||
return FALSE
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
|
||||
if(!can_be_seen(get_turf(loc)))
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
T.atmos_spawn_air("o2=[amt]")
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/AttackingTarget()
|
||||
..()
|
||||
. = ..()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(prob(15))
|
||||
|
||||
@@ -307,7 +307,7 @@
|
||||
|
||||
//Simple animals
|
||||
/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/M)
|
||||
..() //goodbye immortal parrots
|
||||
. = ..() //goodbye immortal parrots
|
||||
|
||||
if(client)
|
||||
return
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
else
|
||||
to_chat(M, "<span class='cult'>You cannot heal <b>[src]</b>, as [p_they()] [p_are()] unharmed!</span>")
|
||||
else if(src != M)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri
|
||||
if(istype(O, /obj/item/device/soulstone))
|
||||
|
||||
@@ -248,7 +248,8 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
|
||||
M.updatehealth()
|
||||
|
||||
/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/M)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
attacked += 10
|
||||
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
if(istype(A))
|
||||
data["areas"] += list(list(
|
||||
"name" = A.area.name,
|
||||
"charge" = A.cell.percent(),
|
||||
"charge" = A.cell ? A.cell.percent() : 0,
|
||||
"load" = A.lastused_total,
|
||||
"charging" = A.charging,
|
||||
"eqp" = A.equipment,
|
||||
|
||||
@@ -49,11 +49,8 @@
|
||||
if(length(A.name) + length(label) > 64)
|
||||
to_chat(user, "<span class='warning'>Label too big!</span>")
|
||||
return
|
||||
if(ishuman(A))
|
||||
to_chat(user, "<span class='warning'>You can't label humans!</span>")
|
||||
return
|
||||
if(issilicon(A))
|
||||
to_chat(user, "<span class='warning'>You can't label cyborgs!</span>")
|
||||
if(ismob(A))
|
||||
to_chat(user, "<span class='warning'>You can't label creatures!</span>") // use a collar
|
||||
return
|
||||
|
||||
user.visible_message("[user] labels [A] as [label].", \
|
||||
|
||||
@@ -479,9 +479,10 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
|
||||
user.visible_message("<span class='suicide'>[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return(OXYLOSS)
|
||||
|
||||
/obj/item/stack/cable_coil/New(loc, amount = MAXCOIL, var/param_color = null)
|
||||
/obj/item/stack/cable_coil/New(loc, new_amount = null, var/param_color = null)
|
||||
..()
|
||||
src.amount = amount
|
||||
if(new_amount) // MAXCOIL by default
|
||||
amount = new_amount
|
||||
if(param_color)
|
||||
item_color = param_color
|
||||
pixel_x = rand(-2,2)
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
|
||||
/obj/structure/floodlight_frame
|
||||
name = "floodlight frame"
|
||||
desc = "A bare metal frame looking vaguely like a floodlight. Requires wrenching down."
|
||||
max_integrity = 100
|
||||
obj_integrity = 100
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "floodlight_c1"
|
||||
density = TRUE
|
||||
var/state = FLOODLIGHT_NEEDS_WRENCHING
|
||||
|
||||
/obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/weapon/wrench) && (state == FLOODLIGHT_NEEDS_WRENCHING))
|
||||
to_chat(user, "<span class='notice'>You secure the [src].</span>")
|
||||
anchored = TRUE
|
||||
state = FLOODLIGHT_NEEDS_WIRES
|
||||
desc = "A bare metal frame looking vaguely like a floodlight. Requires wiring."
|
||||
else if(istype(O, /obj/item/stack/cable_coil) && (state == FLOODLIGHT_NEEDS_WIRES))
|
||||
var/obj/item/stack/S = O
|
||||
if(S.use(5))
|
||||
to_chat(user, "<span class='notice'>You wire the [src].</span>")
|
||||
name = "wired [name]"
|
||||
desc = "A bare metal frame looking vaguely like a floodlight. Requires securing with a screwdriver."
|
||||
icon_state = "floodlight_c2"
|
||||
state = FLOODLIGHT_NEEDS_SECURING
|
||||
else if(istype(O, /obj/item/weapon/light/tube) && (state == FLOODLIGHT_NEEDS_LIGHTS))
|
||||
if(user.transferItemToLoc(O))
|
||||
to_chat(user, "<span class='notice'>You put lights in the [src].</span>")
|
||||
new /obj/machinery/power/floodlight(src.loc)
|
||||
qdel(src)
|
||||
else if(istype(O, /obj/item/weapon/screwdriver) && (state == FLOODLIGHT_NEEDS_SECURING))
|
||||
to_chat(user, "<span class='notice'>You fasten the wiring and electronics in [src].</span>")
|
||||
name = "secured [name]"
|
||||
desc = "A bare metal frame that looks like a floodlight. Requires light tubes."
|
||||
icon_state = "floodlight_c3"
|
||||
state = FLOODLIGHT_NEEDS_LIGHTS
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/power/floodlight
|
||||
name = "floodlight"
|
||||
desc = "A pole with powerful mounted lights on it. Due to its high power draw, it must be powered by a direct connection to a wire node."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "floodlight"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
idle_power_usage = 100
|
||||
active_power_usage = 1000
|
||||
var/list/light_setting_list = list(0, 5, 10, 15)
|
||||
var/light_power_coefficient = 300
|
||||
var/setting = 1
|
||||
light_power = 1.75
|
||||
|
||||
/obj/machinery/power/floodlight/process()
|
||||
if(avail(active_power_usage))
|
||||
add_load(active_power_usage)
|
||||
else
|
||||
change_setting(1)
|
||||
|
||||
/obj/machinery/power/floodlight/proc/change_setting(val, mob/user)
|
||||
if((val < 1) || (val > light_setting_list.len))
|
||||
return
|
||||
active_power_usage = light_setting_list[val]
|
||||
if(!avail(active_power_usage))
|
||||
return change_setting(val - 1)
|
||||
setting = val
|
||||
set_light(light_setting_list[val])
|
||||
var/setting_text = ""
|
||||
if(val > 1)
|
||||
icon_state = "[initial(icon_state)]_on"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
switch(val)
|
||||
if(1)
|
||||
setting_text = "OFF"
|
||||
if(2)
|
||||
setting_text = "low power"
|
||||
if(3)
|
||||
setting_text = "standard lighting"
|
||||
if(4)
|
||||
setting_text = "high power"
|
||||
if(user)
|
||||
to_chat(user, "You set the [src] to [setting_text].")
|
||||
|
||||
/obj/machinery/power/floodlight/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/weapon/wrench))
|
||||
default_unfasten_wrench(user, O, time = 20)
|
||||
if(anchored)
|
||||
connect_to_network()
|
||||
else
|
||||
disconnect_from_network()
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/power/floodlight/attack_hand(mob/user)
|
||||
var/current = setting
|
||||
if(current == 1)
|
||||
current = light_setting_list.len
|
||||
else
|
||||
current--
|
||||
change_setting(current, user)
|
||||
..()
|
||||
|
||||
/obj/machinery/power/floodlight/attack_ai(mob/living/silicon/user)
|
||||
attack_hand(user)
|
||||
..()
|
||||
@@ -43,6 +43,10 @@
|
||||
|
||||
#define HALLUCINATION_RANGE(P) (min(7, round(P ** 0.25)))
|
||||
|
||||
#define GRAVITATIONAL_ANOMALY "gravitational_anomaly"
|
||||
#define FLUX_ANOMALY "flux_anomaly"
|
||||
#define PYRO_ANOMALY "pyro_anomaly"
|
||||
|
||||
/obj/machinery/power/supermatter_shard
|
||||
name = "supermatter shard"
|
||||
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure."
|
||||
@@ -131,13 +135,9 @@
|
||||
|
||||
/obj/machinery/power/supermatter_shard/Destroy()
|
||||
investigate_log("has been destroyed.", "supermatter")
|
||||
if(radio)
|
||||
qdel(radio)
|
||||
radio = null
|
||||
QDEL_NULL(radio)
|
||||
poi_list -= src
|
||||
if(countdown)
|
||||
qdel(countdown)
|
||||
countdown = null
|
||||
QDEL_NULL(countdown)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/power/supermatter_shard/examine(mob/user)
|
||||
@@ -320,11 +320,11 @@
|
||||
if(prob(15) && power > POWER_PENALTY_THRESHOLD)
|
||||
supermatter_pull(src, power/750)
|
||||
if(prob(5))
|
||||
supermatter_anomaly_gen(src, 1, rand(5, 10))
|
||||
supermatter_anomaly_gen(src, FLUX_ANOMALY, rand(5, 10))
|
||||
if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(1))
|
||||
supermatter_anomaly_gen(src, 2, rand(5, 10))
|
||||
supermatter_anomaly_gen(src, GRAVITATIONAL_ANOMALY, rand(5, 10))
|
||||
if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(2) || prob(0.3) && power > POWER_PENALTY_THRESHOLD)
|
||||
supermatter_anomaly_gen(src, 3, rand(5, 10))
|
||||
supermatter_anomaly_gen(src, PYRO_ANOMALY, rand(5, 10))
|
||||
|
||||
|
||||
|
||||
@@ -526,23 +526,17 @@
|
||||
step_towards(pulled_object,center)
|
||||
step_towards(pulled_object,center)
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/supermatter_anomaly_gen(turf/anomalycenter, type = 1, anomalyrange = 5)
|
||||
/obj/machinery/power/supermatter_shard/proc/supermatter_anomaly_gen(turf/anomalycenter, type = FLUX_ANOMALY, anomalyrange = 5)
|
||||
var/turf/L = pick(orange(anomalyrange, anomalycenter))
|
||||
if(L)
|
||||
if(type == 1)
|
||||
var/obj/effect/anomaly/flux/A = new(L)
|
||||
A.explosive = 0
|
||||
A.lifespan = 300
|
||||
else if(type == 2)
|
||||
var/obj/effect/anomaly/grav/A = new(L)
|
||||
A.lifespan = 250
|
||||
else if(type == 3)
|
||||
var/obj/effect/anomaly/pyro/A = new(L)
|
||||
A.lifespan = 200
|
||||
|
||||
return
|
||||
switch(type)
|
||||
if(FLUX_ANOMALY)
|
||||
var/obj/effect/anomaly/flux/A = new(L, 300)
|
||||
A.explosive = FALSE
|
||||
if(GRAVITATIONAL_ANOMALY)
|
||||
new /obj/effect/anomaly/grav(L, 250)
|
||||
if(PYRO_ANOMALY)
|
||||
new /obj/effect/anomaly/pyro(L, 200)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/supermatter_zap(atom/zapstart, range = 3, power)
|
||||
. = zapstart.dir
|
||||
@@ -613,3 +607,6 @@
|
||||
supermatter_zap(target_structure, 5, power / 1.5)
|
||||
|
||||
#undef HALLUCINATION_RANGE
|
||||
#undef GRAVITATIONAL_ANOMALY
|
||||
#undef FLUX_ANOMALY
|
||||
#undef PYRO_ANOMALY
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
C.client.images -= chunk.obscured
|
||||
C.remote_control = null
|
||||
C.unset_machine()
|
||||
src.Remove(C)
|
||||
Remove(C)
|
||||
|
||||
|
||||
/datum/action/innate/slime_place
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
/obj/item/golem_shell/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
var/species
|
||||
if(istype(I, /obj/item/stack/sheet))
|
||||
var/obj/item/stack/sheet/O = I
|
||||
if(istype(I, /obj/item/stack/))
|
||||
var/obj/item/stack/O = I
|
||||
|
||||
if(istype(O, /obj/item/stack/sheet/metal))
|
||||
species = /datum/species/golem
|
||||
|
||||
@@ -144,28 +144,19 @@
|
||||
//BOX O' IMPLANTS
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants
|
||||
name = "boxed cybernetic implant"
|
||||
name = "boxed cybernetic implants"
|
||||
desc = "A sleek, sturdy box."
|
||||
icon_state = "cyber_implants"
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants/New(loc, implant)
|
||||
..()
|
||||
new /obj/item/device/autoimplanter(src)
|
||||
if(ispath(implant))
|
||||
new implant(src)
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants/bundle
|
||||
name = "boxed cybernetic implants"
|
||||
var/list/boxed = list(
|
||||
/obj/item/organ/eyes/robotic/xray,
|
||||
/obj/item/organ/eyes/robotic/thermals,
|
||||
/obj/item/organ/cyberimp/brain/anti_stun,
|
||||
/obj/item/organ/cyberimp/chest/reviver)
|
||||
/obj/item/device/autosurgeon/thermal_eyes,
|
||||
/obj/item/device/autosurgeon/xray_eyes,
|
||||
/obj/item/device/autosurgeon/anti_stun,
|
||||
/obj/item/device/autosurgeon/reviver)
|
||||
var/amount = 5
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants/bundle/New()
|
||||
..()
|
||||
var/implant
|
||||
while(contents.len <= amount + 1) // +1 for the autoimplanter.
|
||||
while(contents.len <= amount)
|
||||
implant = pick(boxed)
|
||||
new implant(src)
|
||||
|
||||
+33
-14
@@ -1,21 +1,27 @@
|
||||
#define INFINITE -1
|
||||
|
||||
/obj/item/device/autoimplanter
|
||||
name = "autoimplanter"
|
||||
desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants."
|
||||
/obj/item/device/autosurgeon
|
||||
name = "autosurgeon"
|
||||
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert implants/organs and a screwdriver slot for removing accidentally added items."
|
||||
icon_state = "autoimplanter"
|
||||
item_state = "walkietalkie"//left as this so as to intentionally not have inhands
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/obj/item/organ/storedorgan
|
||||
var/organ_type = /obj/item/organ/cyberimp
|
||||
var/organ_type = /obj/item/organ
|
||||
var/uses = INFINITE
|
||||
var/starting_organ
|
||||
|
||||
/obj/item/device/autoimplanter/New()
|
||||
/obj/item/device/autosurgeon/Initialize(mapload)
|
||||
..()
|
||||
if(storedorgan)
|
||||
storedorgan.loc = src
|
||||
if(starting_organ)
|
||||
insert_organ(new starting_organ(src))
|
||||
|
||||
/obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used...
|
||||
/obj/item/device/autosurgeon/proc/insert_organ(var/obj/item/I)
|
||||
storedorgan = I
|
||||
I.forceMove(src)
|
||||
name = "[initial(name)] ([storedorgan.name])"
|
||||
|
||||
/obj/item/device/autosurgeon/attack_self(mob/user)//when the object it used...
|
||||
if(!uses)
|
||||
to_chat(user, "<span class='warning'>[src] has already been used. The tools are dull and won't reactivate.</span>")
|
||||
return
|
||||
@@ -26,12 +32,13 @@
|
||||
user.visible_message("<span class='notice'>[user] presses a button on [src], and you hear a short mechanical noise.</span>", "<span class='notice'>You feel a sharp sting as [src] plunges into your body.</span>")
|
||||
playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, 1)
|
||||
storedorgan = null
|
||||
name = initial(name)
|
||||
if(uses != INFINITE)
|
||||
uses--
|
||||
if(!uses)
|
||||
desc = "[initial(desc)] Looks like it's been used up."
|
||||
|
||||
/obj/item/device/autoimplanter/attackby(obj/item/I, mob/user, params)
|
||||
/obj/item/device/autosurgeon/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, organ_type))
|
||||
if(storedorgan)
|
||||
to_chat(user, "<span class='notice'>[src] already has an implant stored.</span>")
|
||||
@@ -41,7 +48,7 @@
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
storedorgan = I
|
||||
to_chat(user, "<span class='notice'>You insert the [I] into [src].</span>")
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
@@ -58,8 +65,20 @@
|
||||
if(!uses)
|
||||
desc = "[initial(desc)] Looks like it's been used up."
|
||||
|
||||
/obj/item/device/autoimplanter/cmo
|
||||
name = "medical HUD autoimplanter"
|
||||
desc = "A single use autoimplanter that contains a medical heads-up display augment. A screwdriver can be used to remove it, but implants can't be placed back in."
|
||||
storedorgan = new/obj/item/organ/cyberimp/eyes/hud/medical()
|
||||
/obj/item/device/autosurgeon/cmo
|
||||
desc = "A single use autosurgeon that contains a medical heads-up display augment. A screwdriver can be used to remove it, but implants can't be placed back in."
|
||||
uses = 1
|
||||
starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical
|
||||
|
||||
|
||||
/obj/item/device/autosurgeon/thermal_eyes
|
||||
starting_organ = /obj/item/organ/eyes/robotic/thermals
|
||||
|
||||
/obj/item/device/autosurgeon/xray_eyes
|
||||
starting_organ = /obj/item/organ/eyes/robotic/xray
|
||||
|
||||
/obj/item/device/autosurgeon/anti_stun
|
||||
starting_organ = /obj/item/organ/cyberimp/brain/anti_stun
|
||||
|
||||
/obj/item/device/autosurgeon/reviver
|
||||
starting_organ = /obj/item/organ/cyberimp/chest/reviver
|
||||
@@ -12,13 +12,17 @@
|
||||
var/vital = 0
|
||||
|
||||
|
||||
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
if(!iscarbon(M) || owner == M)
|
||||
return
|
||||
|
||||
var/obj/item/organ/replaced = M.getorganslot(slot)
|
||||
if(replaced)
|
||||
replaced.Remove(M, special = 1)
|
||||
if(drop_if_replaced)
|
||||
replaced.forceMove(get_turf(src))
|
||||
else
|
||||
qdel(replaced)
|
||||
|
||||
owner = M
|
||||
M.internal_organs |= src
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
var/list/uplink_items = list() // Global list so we only initialize this once.
|
||||
|
||||
/proc/initialize_global_uplink_items()
|
||||
uplink_items = list()
|
||||
for(var/item in subtypesof(/datum/uplink_item))
|
||||
var/datum/uplink_item/I = new item()
|
||||
if(!I.item)
|
||||
continue
|
||||
if(!uplink_items[I.category])
|
||||
uplink_items[I.category] = list()
|
||||
uplink_items[I.category][I.name] = I
|
||||
|
||||
/proc/get_uplink_items(var/datum/game_mode/gamemode = null)
|
||||
if(!uplink_items.len)
|
||||
for(var/item in subtypesof(/datum/uplink_item))
|
||||
var/datum/uplink_item/I = new item()
|
||||
if(!I.item)
|
||||
continue
|
||||
if(!uplink_items[I.category])
|
||||
uplink_items[I.category] = list()
|
||||
uplink_items[I.category][I.name] = I
|
||||
initialize_global_uplink_items()
|
||||
|
||||
var/list/filtered_uplink_items = list()
|
||||
var/list/sale_items = list()
|
||||
@@ -16,6 +20,8 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
|
||||
for(var/category in uplink_items)
|
||||
for(var/item in uplink_items[category])
|
||||
var/datum/uplink_item/I = uplink_items[category][item]
|
||||
if(!istype(I))
|
||||
continue
|
||||
if(I.include_modes.len)
|
||||
if(!gamemode && SSticker && !(SSticker.mode.type in I.include_modes))
|
||||
continue
|
||||
@@ -117,6 +123,11 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
|
||||
to_chat(H, "\The [A] materializes onto the floor.")
|
||||
return 1
|
||||
|
||||
/datum/uplink_item/Destroy()
|
||||
if(src in uplink_items)
|
||||
uplink_items -= src //Take us out instead of leaving a null!
|
||||
return ..()
|
||||
|
||||
//Discounts (dynamically filled above)
|
||||
/datum/uplink_item/discounts
|
||||
category = "Discounted Gear"
|
||||
@@ -1146,40 +1157,40 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/device/uplink/U)
|
||||
if(item)
|
||||
if(istype(item, /obj/item/organ/cyberimp))
|
||||
if(istype(item, /obj/item/organ))
|
||||
return new /obj/item/weapon/storage/box/cyber_implants(loc, item)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/uplink_item/cyber_implants/thermals
|
||||
name = "Thermal eyes"
|
||||
desc = "These cybernetic eyes will give you thermal vision. Comes with a free autoimplanter."
|
||||
item = /obj/item/organ/eyes/robotic/thermals
|
||||
name = "Thermal Eyes"
|
||||
desc = "These cybernetic eyes will give you thermal vision. Comes with a free autosurgeon."
|
||||
item = /obj/item/device/autosurgeon/thermal_eyes
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/cyber_implants/xray
|
||||
name = "X-Ray Vision Implant"
|
||||
desc = "These cybernetic eyes will give you X-ray vision. Comes with an autoimplanter."
|
||||
item = /obj/item/organ/eyes/robotic/xray
|
||||
desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon."
|
||||
item = /obj/item/device/autosurgeon/xray_eyes
|
||||
cost = 10
|
||||
|
||||
/datum/uplink_item/cyber_implants/antistun
|
||||
name = "CNS Rebooter Implant"
|
||||
desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autoimplanter."
|
||||
item = /obj/item/organ/cyberimp/brain/anti_stun
|
||||
desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon."
|
||||
item = /obj/item/device/autosurgeon/anti_stun
|
||||
cost = 12
|
||||
|
||||
/datum/uplink_item/cyber_implants/reviver
|
||||
name = "Reviver Implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. Comes with an autoimplanter."
|
||||
item = /obj/item/organ/cyberimp/chest/reviver
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. Comes with an autosurgeon."
|
||||
item = /obj/item/device/autosurgeon/reviver
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/cyber_implants/bundle
|
||||
name = "Cybernetic Implants Bundle"
|
||||
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. Comes with an autoimplanter."
|
||||
item = /obj/item/weapon/storage/box/cyber_implants/bundle
|
||||
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. Comes with an autosurgeon."
|
||||
item = /obj/item/weapon/storage/box/cyber_implants
|
||||
cost = 40
|
||||
cant_discount = TRUE
|
||||
|
||||
|
||||
@@ -31,4 +31,8 @@ endmap
|
||||
|
||||
map deltastation
|
||||
minplayers 50
|
||||
endmap
|
||||
|
||||
map cerestation
|
||||
minplayers 45
|
||||
endmap
|
||||
+27
-28
@@ -55,6 +55,33 @@
|
||||
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">30 March 2017</h2>
|
||||
<h3 class="author">coiax updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Autoimplanters have been renamed to autosurgeons. Currently only the CMO and nuclear operatives have access to autosurgeons. What is the CMO hiding?</li>
|
||||
<li class="bugfix">All upgraded organs for purchase by nuclear operatives now actually come in an autosurgeon, for speed of surgery.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">29 March 2017</h2>
|
||||
<h3 class="author">BeeSting12 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds emergency launch console to the backup emergency shuttle.</li>
|
||||
</ul>
|
||||
<h3 class="author">Joan updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">Putting sec armour and a helmet on a corgi no longer makes the corgi immune to item attacks.</li>
|
||||
<li class="rscadd">All items with armour will now grant corgis actual armour.</li>
|
||||
</ul>
|
||||
<h3 class="author">Kevinz000 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">High-powered floodlights may be constructed with 5 sheets of metal, a wrench, a screwdriver, 5 cable coils, and a light tube. They require a powernet connection via direct wire node.</li>
|
||||
</ul>
|
||||
<h3 class="author">coiax updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">All tophats, rather than just the ones in maintenance, hurt a tiny bit if you throw them at people.</li>
|
||||
<li class="bugfix">Supermatter anomalies are more shortlived than regular anomalies, as intended.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">28 March 2017</h2>
|
||||
<h3 class="author">Supermichael777 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
@@ -1811,34 +1838,6 @@
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">There are now updated names and descriptions for the items that your plasma-based crewmembers start with and use frequently.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">26 January 2017</h2>
|
||||
<h3 class="author">Robustin updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Unholy Water can now be thrown or vaporized to deliver a powerful poison unto the cult's enemies - or healing and stun resistance to its acolytes.</li>
|
||||
</ul>
|
||||
<h3 class="author">Tofa01 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Moved Meta station AI MiniSat tracking beacon to AI MiniSat entrance. Should prevent being regular teleported into space.</li>
|
||||
<li class="bugfix">Added missing row of pixels to Flypeople torso so head connects to body properly.</li>
|
||||
</ul>
|
||||
<h3 class="author">Tofa01 & XDTM updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds radio alert messages going to medical channel to the cryo tube when a patient is fully restored.</li>
|
||||
<li class="soundadd">Adds new alert sound for cryo tube. (cryo_warning.ogg)</li>
|
||||
</ul>
|
||||
<h3 class="author">XDTM updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Voice of God has received a few more commands.</li>
|
||||
<li class="rscadd">You can now use job abbreviations (ex. hos > head of security) and first names (ex. Duke > Duke Hayka) to focus targets.</li>
|
||||
</ul>
|
||||
<h3 class="author">coiax updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">The nuclear operative cybernetic implant bundle now actually contains implants.</li>
|
||||
<li class="rscdel">The cybernetic implant bundle is no longer eligible for discounts (bundles are, in general, not eligible).</li>
|
||||
<li class="rscadd">Telecrystals can be purchased in stacks of five and twenty.</li>
|
||||
<li class="rscadd">The entire stack of telecrystals are added to the uplink when charging them.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<b>GoonStation 13 Development Team</b>
|
||||
|
||||
@@ -10385,3 +10385,24 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
crowbar, preserving the floor tile.
|
||||
octareenroon91:
|
||||
- bugfix: Bonfires that have a metal rod added should buckle instead of runtiming.
|
||||
2017-03-29:
|
||||
BeeSting12:
|
||||
- rscadd: Adds emergency launch console to the backup emergency shuttle.
|
||||
Joan:
|
||||
- rscdel: Putting sec armour and a helmet on a corgi no longer makes the corgi immune
|
||||
to item attacks.
|
||||
- rscadd: All items with armour will now grant corgis actual armour.
|
||||
Kevinz000:
|
||||
- rscadd: High-powered floodlights may be constructed with 5 sheets of metal, a
|
||||
wrench, a screwdriver, 5 cable coils, and a light tube. They require a powernet
|
||||
connection via direct wire node.
|
||||
coiax:
|
||||
- bugfix: All tophats, rather than just the ones in maintenance, hurt a tiny bit
|
||||
if you throw them at people.
|
||||
- bugfix: Supermatter anomalies are more shortlived than regular anomalies, as intended.
|
||||
2017-03-30:
|
||||
coiax:
|
||||
- rscadd: Autoimplanters have been renamed to autosurgeons. Currently only the CMO
|
||||
and nuclear operatives have access to autosurgeons. What is the CMO hiding?
|
||||
- bugfix: All upgraded organs for purchase by nuclear operatives now actually come
|
||||
in an autosurgeon, for speed of surgery.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
author: "Joan"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscdel: "Putting sec armour and a helmet on a corgi no longer makes the corgi immune to item attacks."
|
||||
- rscadd: "All items with armour will now grant corgis actual armour."
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 25 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 22 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user