Merge upstream

This commit is contained in:
Cyberboss
2017-03-30 19:18:59 -04:00
102 changed files with 8157 additions and 382 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
## /tg/station v1.0.1
## /tg/station
[![Build Status](https://travis-ci.org/tgstation/tgstation.png)](https://travis-ci.org/tgstation/tgstation) [![Krihelimeter](http://www.krihelinator.xyz/badge/tgstation/tgstation)](http://www.krihelinator.xyz)
+1
View File
@@ -0,0 +1 @@
#define FORCE_MAP "_maps/cerestation.json"
+7
View File
@@ -0,0 +1,7 @@
{
"map_name": "CereStation",
"map_path": "map_files/Cerestation",
"map_file": "cerestation.dmm",
"minetype": "lavaland",
"transition_config": "default"
}
+1
View File
@@ -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
+5 -1
View File
@@ -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
View File
@@ -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
+6
View File
@@ -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.
+19
View File
@@ -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
+2
View File
@@ -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:
+4 -5
View File
@@ -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)
+21 -12
View File
@@ -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)
+6
View File
@@ -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)
+11 -11
View File
@@ -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
+1
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+5 -7
View File
@@ -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
+21 -21
View File
@@ -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
+4 -2
View File
@@ -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
+7 -1
View File
@@ -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,
+6 -6
View File
@@ -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
+20
View File
@@ -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()
+2 -2
View File
@@ -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()
+1
View File
@@ -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"
+20 -5
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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,
+2 -5
View File
@@ -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].", \
+3 -2
View File
@@ -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)
+106
View File
@@ -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)
..()
+21 -24
View File
@@ -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
+2 -2
View File
@@ -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)
@@ -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
+30 -19
View File
@@ -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
+4
View File
@@ -31,4 +31,8 @@ endmap
map deltastation
minplayers 50
endmap
map cerestation
minplayers 45
endmap
+27 -28
View File
@@ -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>
+21
View File
@@ -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