diff --git a/baystation12.dme b/baystation12.dme
index 4ab3dc4a450..e8d58514225 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -7,229 +7,12 @@
// BEGIN_FILE_DIR
#define FILE_DIR .
#define FILE_DIR "code"
-#define FILE_DIR "code/ATMOSPHERICS"
-#define FILE_DIR "code/ATMOSPHERICS/components"
-#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices"
-#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices"
-#define FILE_DIR "code/ATMOSPHERICS/components/unary"
-#define FILE_DIR "code/controllers"
-#define FILE_DIR "code/datums"
-#define FILE_DIR "code/datums/diseases"
-#define FILE_DIR "code/datums/helper_datums"
-#define FILE_DIR "code/datums/organs"
-#define FILE_DIR "code/datums/spells"
-#define FILE_DIR "code/defines"
-#define FILE_DIR "code/defines/obj"
-#define FILE_DIR "code/defines/obj/clothing"
-#define FILE_DIR "code/defines/procs"
-#define FILE_DIR "code/defines/sd_procs"
-#define FILE_DIR "code/FEA"
-#define FILE_DIR "code/game"
-#define FILE_DIR "code/game/area"
-#define FILE_DIR "code/game/events"
-#define FILE_DIR "code/game/events/EventProcs"
-#define FILE_DIR "code/game/events/Events"
-#define FILE_DIR "code/game/gamemodes"
-#define FILE_DIR "code/game/gamemodes/autotraitor"
-#define FILE_DIR "code/game/gamemodes/blob"
-#define FILE_DIR "code/game/gamemodes/blob/blobs"
-#define FILE_DIR "code/game/gamemodes/changeling"
-#define FILE_DIR "code/game/gamemodes/cult"
-#define FILE_DIR "code/game/gamemodes/epidemic"
-#define FILE_DIR "code/game/gamemodes/events"
-#define FILE_DIR "code/game/gamemodes/events/holidays"
-#define FILE_DIR "code/game/gamemodes/extended"
-#define FILE_DIR "code/game/gamemodes/malfunction"
-#define FILE_DIR "code/game/gamemodes/meme"
-#define FILE_DIR "code/game/gamemodes/meteor"
-#define FILE_DIR "code/game/gamemodes/nuclear"
-#define FILE_DIR "code/game/gamemodes/revolution"
-#define FILE_DIR "code/game/gamemodes/sandbox"
-#define FILE_DIR "code/game/gamemodes/traitor"
-#define FILE_DIR "code/game/gamemodes/wizard"
-#define FILE_DIR "code/game/jobs"
-#define FILE_DIR "code/game/jobs/job"
-#define FILE_DIR "code/game/machinery"
-#define FILE_DIR "code/game/machinery/atmoalter"
-#define FILE_DIR "code/game/machinery/bots"
-#define FILE_DIR "code/game/machinery/camera"
-#define FILE_DIR "code/game/machinery/computer"
-#define FILE_DIR "code/game/machinery/doors"
-#define FILE_DIR "code/game/machinery/embedded_controller"
-#define FILE_DIR "code/game/machinery/kitchen"
-#define FILE_DIR "code/game/machinery/pipe"
-#define FILE_DIR "code/game/machinery/telecomms"
-#define FILE_DIR "code/game/magic"
-#define FILE_DIR "code/game/mecha"
-#define FILE_DIR "code/game/mecha/combat"
-#define FILE_DIR "code/game/mecha/equipment"
-#define FILE_DIR "code/game/mecha/equipment/tools"
-#define FILE_DIR "code/game/mecha/equipment/weapons"
-#define FILE_DIR "code/game/mecha/medical"
-#define FILE_DIR "code/game/mecha/working"
-#define FILE_DIR "code/game/objects"
-#define FILE_DIR "code/game/objects/closets"
-#define FILE_DIR "code/game/objects/closets/secure"
-#define FILE_DIR "code/game/objects/effects"
-#define FILE_DIR "code/game/objects/effects/decals"
-#define FILE_DIR "code/game/objects/effects/decals/Cleanable"
-#define FILE_DIR "code/game/objects/effects/spawners"
-#define FILE_DIR "code/game/objects/items"
-#define FILE_DIR "code/game/objects/items/devices"
-#define FILE_DIR "code/game/objects/items/devices/PDA"
-#define FILE_DIR "code/game/objects/items/devices/radio"
-#define FILE_DIR "code/game/objects/items/robot"
-#define FILE_DIR "code/game/objects/items/stacks"
-#define FILE_DIR "code/game/objects/items/stacks/sheets"
-#define FILE_DIR "code/game/objects/items/stacks/tiles"
-#define FILE_DIR "code/game/objects/items/weapons"
-#define FILE_DIR "code/game/objects/items/weapons/grenades"
-#define FILE_DIR "code/game/objects/items/weapons/implants"
-#define FILE_DIR "code/game/objects/items/weapons/secstorage"
-#define FILE_DIR "code/game/objects/items/weapons/storage"
-#define FILE_DIR "code/game/objects/items/weapons/tanks"
-#define FILE_DIR "code/game/objects/storage"
-#define FILE_DIR "code/game/objects/structures"
-#define FILE_DIR "code/game/objects/structures/crates_lockers"
-#define FILE_DIR "code/game/objects/structures/crates_lockers/closets"
-#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure"
-#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest"
-#define FILE_DIR "code/game/player"
-#define FILE_DIR "code/game/structure"
-#define FILE_DIR "code/game/turfs"
-#define FILE_DIR "code/game/turfs/simulated"
-#define FILE_DIR "code/game/turfs/space"
-#define FILE_DIR "code/game/turfs/unsimulated"
-#define FILE_DIR "code/game/vehicles"
-#define FILE_DIR "code/game/vehicles/airtight"
-#define FILE_DIR "code/game/verbs"
-#define FILE_DIR "code/js"
-#define FILE_DIR "code/modules"
-#define FILE_DIR "code/modules/admin"
-#define FILE_DIR "code/modules/admin/DB ban"
-#define FILE_DIR "code/modules/admin/permissionverbs"
-#define FILE_DIR "code/modules/admin/verbs"
-#define FILE_DIR "code/modules/assembly"
-#define FILE_DIR "code/modules/awaymissions"
-#define FILE_DIR "code/modules/awaymissions/maploader"
-#define FILE_DIR "code/modules/chemical"
-#define FILE_DIR "code/modules/client"
-#define FILE_DIR "code/modules/clothing"
-#define FILE_DIR "code/modules/clothing/glasses"
-#define FILE_DIR "code/modules/clothing/gloves"
-#define FILE_DIR "code/modules/clothing/head"
-#define FILE_DIR "code/modules/clothing/masks"
-#define FILE_DIR "code/modules/clothing/shoes"
-#define FILE_DIR "code/modules/clothing/spacesuits"
-#define FILE_DIR "code/modules/clothing/suits"
-#define FILE_DIR "code/modules/clothing/under"
-#define FILE_DIR "code/modules/clothing/under/jobs"
-#define FILE_DIR "code/modules/clothing/uniforms"
-#define FILE_DIR "code/modules/critters"
-#define FILE_DIR "code/modules/critters/hivebots"
-#define FILE_DIR "code/modules/customitems"
-#define FILE_DIR "code/modules/DetectiveWork"
-#define FILE_DIR "code/modules/flufftext"
-#define FILE_DIR "code/modules/food"
-#define FILE_DIR "code/modules/genetics"
-#define FILE_DIR "code/modules/icon generation"
-#define FILE_DIR "code/modules/library"
-#define FILE_DIR "code/modules/liquid"
-#define FILE_DIR "code/modules/maps"
-#define FILE_DIR "code/modules/mining"
-#define FILE_DIR "code/modules/mob"
-#define FILE_DIR "code/modules/mob/dead"
-#define FILE_DIR "code/modules/mob/dead/observer"
-#define FILE_DIR "code/modules/mob/living"
-#define FILE_DIR "code/modules/mob/living/blob"
-#define FILE_DIR "code/modules/mob/living/carbon"
-#define FILE_DIR "code/modules/mob/living/carbon/alien"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/special"
-#define FILE_DIR "code/modules/mob/living/carbon/amorph"
-#define FILE_DIR "code/modules/mob/living/carbon/brain"
-#define FILE_DIR "code/modules/mob/living/carbon/human"
-#define FILE_DIR "code/modules/mob/living/carbon/metroid"
-#define FILE_DIR "code/modules/mob/living/carbon/monkey"
-#define FILE_DIR "code/modules/mob/living/parasite"
-#define FILE_DIR "code/modules/mob/living/silicon"
-#define FILE_DIR "code/modules/mob/living/silicon/ai"
-#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook"
-#define FILE_DIR "code/modules/mob/living/silicon/decoy"
-#define FILE_DIR "code/modules/mob/living/silicon/pai"
-#define FILE_DIR "code/modules/mob/living/silicon/robot"
-#define FILE_DIR "code/modules/mob/living/simple_animal"
-#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
-#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
-#define FILE_DIR "code/modules/mob/new_player"
-#define FILE_DIR "code/modules/mob/simple_animal"
-#define FILE_DIR "code/modules/paperwork"
-#define FILE_DIR "code/modules/power"
-#define FILE_DIR "code/modules/power/antimatter"
-#define FILE_DIR "code/modules/power/singularity"
-#define FILE_DIR "code/modules/power/singularity/particle_accelerator"
-#define FILE_DIR "code/modules/projectiles"
-#define FILE_DIR "code/modules/projectiles/ammunition"
-#define FILE_DIR "code/modules/projectiles/guns"
-#define FILE_DIR "code/modules/projectiles/guns/energy"
-#define FILE_DIR "code/modules/projectiles/guns/projectile"
-#define FILE_DIR "code/modules/projectiles/projectile"
-#define FILE_DIR "code/modules/reagents"
-#define FILE_DIR "code/modules/reagents/reagent_containers"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks"
-#define FILE_DIR "code/modules/reagents/reagent_containers/glass"
-#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle"
-#define FILE_DIR "code/modules/recycling"
-#define FILE_DIR "code/modules/research"
-#define FILE_DIR "code/modules/research/xenoarchaeology"
-#define FILE_DIR "code/modules/scripting"
-#define FILE_DIR "code/modules/scripting/AST"
-#define FILE_DIR "code/modules/scripting/AST/Operators"
-#define FILE_DIR "code/modules/scripting/Implementations"
-#define FILE_DIR "code/modules/scripting/Interpreter"
-#define FILE_DIR "code/modules/scripting/Parser"
-#define FILE_DIR "code/modules/scripting/Scanner"
-#define FILE_DIR "code/modules/security levels"
#define FILE_DIR "code/TriDimension"
-#define FILE_DIR "code/unused"
-#define FILE_DIR "code/unused/beast"
-#define FILE_DIR "code/unused/computer2"
-#define FILE_DIR "code/unused/disease2"
-#define FILE_DIR "code/unused/gamemodes"
-#define FILE_DIR "code/unused/hivebot"
-#define FILE_DIR "code/unused/mining"
-#define FILE_DIR "code/unused/optics"
-#define FILE_DIR "code/unused/pda2"
-#define FILE_DIR "code/unused/powerarmor"
-#define FILE_DIR "code/unused/spacecraft"
#define FILE_DIR "code/WorkInProgress"
-#define FILE_DIR "code/WorkInProgress/AI_Visibility"
-#define FILE_DIR "code/WorkInProgress/animusstation"
-#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
-#define FILE_DIR "code/WorkInProgress/carn"
-#define FILE_DIR "code/WorkInProgress/Chinsky"
-#define FILE_DIR "code/WorkInProgress/mapload"
-#define FILE_DIR "code/WorkInProgress/Mini"
-#define FILE_DIR "code/WorkInProgress/Mloc"
-#define FILE_DIR "code/WorkInProgress/organs"
-#define FILE_DIR "code/WorkInProgress/Ported"
-#define FILE_DIR "code/WorkInProgress/Ported/Abi79"
-#define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy"
-#define FILE_DIR "code/WorkInProgress/Ported/Spawners"
-#define FILE_DIR "code/WorkInProgress/SkyMarshal"
-#define FILE_DIR "code/WorkInProgress/Tastyfish"
-#define FILE_DIR "code/WorkInProgress/virus2"
-#define FILE_DIR "code/WorkInProgress/virus2/Disease2"
-#define FILE_DIR "code/WorkInProgress/Wrongnumber"
-#define FILE_DIR "code/ZAS"
+#define FILE_DIR "code/WorkInProgress/Susan"
#define FILE_DIR "html"
#define FILE_DIR "icons"
#define FILE_DIR "icons/48x48"
@@ -251,9 +34,7 @@
#define FILE_DIR "icons/turf"
#define FILE_DIR "icons/vehicles"
#define FILE_DIR "icons/vending_icons"
-#define FILE_DIR "interface"
#define FILE_DIR "maps"
-#define FILE_DIR "maps/RandomZLevels"
#define FILE_DIR "sound"
#define FILE_DIR "sound/AI"
#define FILE_DIR "sound/ambience"
@@ -269,10 +50,7 @@
#define FILE_DIR "sound/violin"
#define FILE_DIR "sound/voice"
#define FILE_DIR "sound/weapons"
-#define FILE_DIR "tools"
-#define FILE_DIR "tools/Redirector"
// END_FILE_DIR
-
// BEGIN_PREFERENCES
// END_PREFERENCES
@@ -283,6 +61,17 @@
#include "code\setup.dm"
#include "code\stylesheet.dm"
#include "code\world.dm"
+#include "code\__HELPERS\files.dm"
+#include "code\__HELPERS\game.dm"
+#include "code\__HELPERS\global_lists.dm"
+#include "code\__HELPERS\icons.dm"
+#include "code\__HELPERS\lists.dm"
+#include "code\__HELPERS\logging.dm"
+#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\text.dm"
+#include "code\__HELPERS\time.dm"
+#include "code\__HELPERS\type2type.dm"
+#include "code\__HELPERS\unsorted.dm"
#include "code\ATMOSPHERICS\atmospherics.dm"
#include "code\ATMOSPHERICS\datum_pipe_network.dm"
#include "code\ATMOSPHERICS\datum_pipeline.dm"
@@ -350,6 +139,22 @@
#include "code\datums\diseases\robotic_transformation.dm"
#include "code\datums\diseases\wizarditis.dm"
#include "code\datums\diseases\xeno_transformation.dm"
+#include "code\datums\diseases\advance\advance.dm"
+#include "code\datums\diseases\advance\cold.dm"
+#include "code\datums\diseases\advance\flu.dm"
+#include "code\datums\diseases\advance\symptoms\confusion.dm"
+#include "code\datums\diseases\advance\symptoms\cough.dm"
+#include "code\datums\diseases\advance\symptoms\damage_converter.dm"
+#include "code\datums\diseases\advance\symptoms\dizzy.dm"
+#include "code\datums\diseases\advance\symptoms\fever.dm"
+#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
+#include "code\datums\diseases\advance\symptoms\headache.dm"
+#include "code\datums\diseases\advance\symptoms\itching.dm"
+#include "code\datums\diseases\advance\symptoms\shivering.dm"
+#include "code\datums\diseases\advance\symptoms\sneeze.dm"
+#include "code\datums\diseases\advance\symptoms\symptoms.dm"
+#include "code\datums\diseases\advance\symptoms\vomit.dm"
+#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
@@ -383,26 +188,10 @@
#include "code\defines\obj\weapon.dm"
#include "code\defines\procs\AStar.dm"
#include "code\defines\procs\captain_announce.dm"
-#include "code\defines\procs\church_name.dm"
#include "code\defines\procs\command_alert.dm"
-#include "code\defines\procs\command_name.dm"
#include "code\defines\procs\dbcore.dm"
-#include "code\defines\procs\forum_activation.dm"
-#include "code\defines\procs\gamehelpers.dm"
-#include "code\defines\procs\global_lists.dm"
-#include "code\defines\procs\helper_list.dm"
-#include "code\defines\procs\helper_text.dm"
-#include "code\defines\procs\helper_type2type.dm"
-#include "code\defines\procs\helpers.dm"
-#include "code\defines\procs\icon_procs.dm"
-#include "code\defines\procs\icon_procs_readme.dm"
-#include "code\defines\procs\logging.dm"
-#include "code\defines\procs\religion_name.dm"
#include "code\defines\procs\sd_Alert.dm"
-#include "code\defines\procs\station_name.dm"
#include "code\defines\procs\statistics.dm"
-#include "code\defines\procs\syndicate_name.dm"
-#include "code\defines\procs\time_stamp.dm"
#include "code\game\asteroid.dm"
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
@@ -630,7 +419,6 @@
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
#include "code\game\mecha\medical\odysseus.dm"
-#include "code\game\mecha\working\firefighter.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
#include "code\game\objects\empulse.dm"
@@ -735,7 +523,6 @@
#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\mop.dm"
-#include "code\game\objects\items\weapons\mousetraps.dm"
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\photography.dm"
@@ -836,7 +623,6 @@
#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm"
-#include "code\game\player\admin_report.dm"
#include "code\game\turfs\simulated.dm"
#include "code\game\turfs\turf.dm"
#include "code\game\turfs\unsimulated.dm"
@@ -867,6 +653,7 @@
#include "code\modules\admin\admin.dm"
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm"
+#include "code\modules\admin\admin_ranks.dm"
#include "code\modules\admin\admin_verbs.dm"
#include "code\modules\admin\banjob.dm"
#include "code\modules\admin\create_mob.dm"
@@ -879,9 +666,9 @@
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\topic.dm"
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\DB ban\functions.dm"
-#include "code\modules\admin\permissionverbs\assignment.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
@@ -914,6 +701,7 @@
#include "code\modules\assembly\holder.dm"
#include "code\modules\assembly\igniter.dm"
#include "code\modules\assembly\infrared.dm"
+#include "code\modules\assembly\mousetrap.dm"
#include "code\modules\assembly\proximity.dm"
#include "code\modules\assembly\shock_kit.dm"
#include "code\modules\assembly\signaler.dm"
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 1f3aae999d4..e92cc485100 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -88,14 +88,14 @@ obj/machinery/atmospherics/binary/passive_gate
return 1
- interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
+ interact(mob/user as mob)
+ var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure:
+ [round(target_pressure,0.1)]kPa | Change
+ "}
- user << browse("
[src.name] control[dat]", "window=atmo_pump")
- onclose(user, "atmo_pump")
+ user << browse("[src.name] control[dat]", "window=atmo_pump")
+ onclose(user, "atmo_pump")
initialize()
..()
@@ -138,7 +138,7 @@ obj/machinery/atmospherics/binary/passive_gate
if(!src.allowed(user))
user << "\red Access denied."
return
- usr.machine = src
+ usr.set_machine(src)
interact(user)
return
@@ -149,7 +149,7 @@ obj/machinery/atmospherics/binary/passive_gate
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = max(0, min(4500, new_pressure))
- usr.machine = src
+ usr.set_machine(src)
src.update_icon()
src.updateUsrDialog()
return
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 7746d238d22..f22da69ff80 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -107,14 +107,14 @@ obj/machinery/atmospherics/binary/pump
return 1
- interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
+ interact(mob/user as mob)
+ var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure:
+ [round(target_pressure,0.1)]kPa | Change
+ "}
- user << browse("[src.name] control[dat]", "window=atmo_pump")
- onclose(user, "atmo_pump")
+ user << browse("[src.name] control[dat]", "window=atmo_pump")
+ onclose(user, "atmo_pump")
initialize()
..()
@@ -156,7 +156,7 @@ obj/machinery/atmospherics/binary/pump
if(!src.allowed(user))
user << "\red Access denied."
return
- usr.machine = src
+ usr.set_machine(src)
interact(user)
return
@@ -167,7 +167,7 @@ obj/machinery/atmospherics/binary/pump
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = max(0, min(4500, new_pressure))
- usr.machine = src
+ usr.set_machine(src)
src.update_icon()
src.updateUsrDialog()
return
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index c04a927fc48..2c5f2337064 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -97,14 +97,14 @@ obj/machinery/atmospherics/binary/volume_pump
return 1
- interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow:
- [round(transfer_rate,1)]l/s | Change
- "}
+ interact(mob/user as mob)
+ var/dat = {"Power: [on?"On":"Off"]
+ Desirable output flow:
+ [round(transfer_rate,1)]l/s | Change
+ "}
- user << browse("[src.name] control[dat]", "window=atmo_pump")
- onclose(user, "atmo_pump")
+ user << browse("[src.name] control[dat]", "window=atmo_pump")
+ onclose(user, "atmo_pump")
@@ -147,7 +147,7 @@ obj/machinery/atmospherics/binary/volume_pump
if(!src.allowed(user))
user << "\red Access denied."
return
- usr.machine = src
+ usr.set_machine(src)
interact(user)
return
@@ -158,7 +158,7 @@ obj/machinery/atmospherics/binary/volume_pump
if(href_list["set_transfer_rate"])
var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num
src.transfer_rate = max(0, min(200, new_transfer_rate))
- usr.machine = src
+ usr.set_machine(src)
src.update_icon()
src.updateUsrDialog()
return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 55b0a195164..a2d72ca523b 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -211,7 +211,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
if(..())
return
- usr.machine = src
+ usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["filterset"])
src.filter_type = text2num(href_list["filterset"])
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 026c3531fdf..69307784a94 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -112,7 +112,7 @@ obj/machinery/atmospherics/trinary/mixer
if(!src.allowed(user))
user << "\red Access denied."
return
- usr.machine = src
+ usr.set_machine(src)
var/dat = {"Power: [on?"On":"Off"]
Desirable output pressure:
[target_pressure]kPa | Change
diff --git a/code/FEA/FEA_airgroup.dm b/code/FEA/FEA_airgroup.dm
index 00a6afc3949..67b5c757565 100644
--- a/code/FEA/FEA_airgroup.dm
+++ b/code/FEA/FEA_airgroup.dm
@@ -90,7 +90,8 @@ datum/air_group
if (next_check > 0)
next_check--
return 1
- next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
+ var/player_count = max(player_list.len, 3) / 3
+ next_check += check_delay + rand(player_count, player_count * 1.5)
check_delay++
var/turf/simulated/list/border_individual = list()
diff --git a/code/FEA/FEA_fire.dm b/code/FEA/FEA_fire.dm
index d28df56a340..6aaf328b9be 100644
--- a/code/FEA/FEA_fire.dm
+++ b/code/FEA/FEA_fire.dm
@@ -152,7 +152,7 @@
else
chance_of_deletion = 100
if(prob(chance_of_deletion))
- T.ReplaceWithSpace()
+ T.ChangeTurf(/turf/space)
else
T.to_be_destroyed = 0
T.max_fire_temperature_sustained = 0
diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm
index d043e348245..1fd6aaf7152 100644
--- a/code/FEA/FEA_turf_tile.dm
+++ b/code/FEA/FEA_turf_tile.dm
@@ -304,7 +304,8 @@ turf
if (next_check > 0)
next_check--
return 1
- next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
+ var/player_count = max(player_list.len, 3) / 3
+ next_check += check_delay + rand(player_count, player_count * 1.5)
check_delay++
var/turf/simulated/list/possible_fire_spreads = list()
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm
index 3dcfda32c05..b7a464a6754 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm
@@ -13,15 +13,6 @@
spawn(0)
core_generator = locate() in world
- attack_ai(mob/user)
- attack_hand(user)
-
- attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER))
- return
- interact(user)
-
Topic(href, href_list)
..()
if( href_list["shutdown"] )
@@ -52,36 +43,35 @@
if(updating)
src.updateDialog()
- proc
- interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=core_monitor")
- return
- var/t = "Reactor Core Primary Monitor
"
- if(core_generator)
- t += "[core_generator.on ? "Core Generator connected" : "Core Generator operational"]
"
- if(core_generator.owned_field)
- t += "Core suspension field online \[Bring field offline\]
"
- t += "Electromagnetic plasma suspension field status:
"
- t += " Strength (T): [core_generator.owned_field.field_strength] \[Modify\]
"
- t += " Energy levels (MeV): [core_generator.owned_field.mega_energy]
"
- t += " Core frequency: [core_generator.owned_field.frequency]
"
- t += " Moles of plasma: [core_generator.owned_field.held_plasma.toxins]
"
- t += " Core temperature: [core_generator.owned_field.held_plasma.temperature]
"
- t += "
"
- t += "Core atomic and subatomic constituents:
"
- if(core_generator.owned_field.dormant_reactant_quantities && core_generator.owned_field.dormant_reactant_quantities.len)
- for(var/reagent in core_generator.owned_field.dormant_reactant_quantities)
- t += " [reagent]: [core_generator.owned_field.dormant_reactant_quantities[reagent]]
"
- else
- t += " No reactants present.
"
+ interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=core_monitor")
+ return
+ var/t = "Reactor Core Primary Monitor
"
+ if(core_generator)
+ t += "[core_generator.on ? "Core Generator connected" : "Core Generator operational"]
"
+ if(core_generator.owned_field)
+ t += "Core suspension field online \[Bring field offline\]
"
+ t += "Electromagnetic plasma suspension field status:
"
+ t += " Strength (T): [core_generator.owned_field.field_strength] \[Modify\]
"
+ t += " Energy levels (MeV): [core_generator.owned_field.mega_energy]
"
+ t += " Core frequency: [core_generator.owned_field.frequency]
"
+ t += " Moles of plasma: [core_generator.owned_field.held_plasma.toxins]
"
+ t += " Core temperature: [core_generator.owned_field.held_plasma.temperature]
"
+ t += "
"
+ t += "Core atomic and subatomic constituents:
"
+ if(core_generator.owned_field.dormant_reactant_quantities && core_generator.owned_field.dormant_reactant_quantities.len)
+ for(var/reagent in core_generator.owned_field.dormant_reactant_quantities)
+ t += " [reagent]: [core_generator.owned_field.dormant_reactant_quantities[reagent]]
"
else
- t += "Core suspension field offline \[Bring field online\]
"
+ t += " No reactants present.
"
else
- t += "Core Generator unresponsive
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=core_monitor;size=500x400")
- user.machine = src
+ t += "Core suspension field offline \[Bring field online\]
"
+ else
+ t += "Core Generator unresponsive
"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=core_monitor;size=500x400")
+ user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm
index 0b05a73927a..a1e28294262 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_compressor.dm
@@ -68,21 +68,20 @@ var/const/max_assembly_amount = 300
F.loc = src.loc
return
- proc
- interact(mob/user)
- /*if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=fuelcomp")
- return*/
- var/t = "Reactor Fuel Rod Compressor / Assembler
"
- t += "Close
"
- t += "Activate Fuel Synthesis
(fuel assemblies require no more than [max_assembly_amount] rods).
"
- t += "
"
- t += "- New fuel assembly constituents:-
"
- for(var/reagent in new_assembly_quantities)
- t += " [reagent] rods: [new_assembly_quantities[reagent]] \[Modify\]
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=fuelcomp;size=500x800")
- user.machine = src
+ interact(mob/user)
+ /*if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=fuelcomp")
+ return*/
+ var/t = "Reactor Fuel Rod Compressor / Assembler
"
+ t += "Close
"
+ t += "Activate Fuel Synthesis
(fuel assemblies require no more than [max_assembly_amount] rods).
"
+ t += "
"
+ t += "- New fuel assembly constituents:-
"
+ for(var/reagent in new_assembly_quantities)
+ t += " [reagent] rods: [new_assembly_quantities[reagent]] \[Modify\]
"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=fuelcomp;size=500x800")
+ user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm
index 4895dfe9199..f4a7f700fa4 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm
@@ -121,53 +121,52 @@
..()
src.updateDialog()
- proc
- interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=fuel_monitor")
- return
- var/t = "Reactor Core Fuel Control
"
- var/cooling = 0
- for(var/stage in stage_status)
- if(stage_status[stage])
- t += "Fuel injection: Active
"
- t += "Enter cooldown phase
"
- cooling = 1
- break
- if(!cooling)
- t += "Fuel injection: Cooling
"
- t += "----
"
- //
- t += "Fuel depletion announcement: "
- t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
- t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
- t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
- t += "Stage progression announcement: "
- t += "[announce_stageprogression ? "Disable" : "Disabled"] "
- t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
- t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
- t += "
"
- t += ""
- t += "| Injector Status | "
- t += "Injection interval (sec) | "
- t += "Assembly consumption per injection | "
- t += "Fuel Assembly Port | "
- t += "Assembly depletion percentage | "
- t += "
"
- for(var/stage_name in fuel_injectors)
- var/list/cur_stage = fuel_injectors[stage_name]
- t += "| Fuel Injection Stage: [stage_name], [stage_status[stage_name] ? "Active \[Enter cooldown\]" : "Cooling \[Begin injection\]"] |
"
- for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
- t += ""
- t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
- t += "[Injector.rate/10] Modify | "
- t += "[Injector.fuel_usage*100]% Modify | "
- t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
- t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.percent_depleted]%" : ""] | "
- t += "
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=fuel_monitor;size=500x600")
- user.machine = src
+ interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=fuel_monitor")
+ return
+ var/t = "Reactor Core Fuel Control
"
+ var/cooling = 0
+ for(var/stage in stage_status)
+ if(stage_status[stage])
+ t += "Fuel injection: Active
"
+ t += "Enter cooldown phase
"
+ cooling = 1
+ break
+ if(!cooling)
+ t += "Fuel injection: Cooling
"
+ t += "----
"
+ //
+ t += "Fuel depletion announcement: "
+ t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
+ t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
+ t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
+ t += "Stage progression announcement: "
+ t += "[announce_stageprogression ? "Disable" : "Disabled"] "
+ t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
+ t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
+ t += "
"
+ t += ""
+ t += "| Injector Status | "
+ t += "Injection interval (sec) | "
+ t += "Assembly consumption per injection | "
+ t += "Fuel Assembly Port | "
+ t += "Assembly depletion percentage | "
+ t += "
"
+ for(var/stage_name in fuel_injectors)
+ var/list/cur_stage = fuel_injectors[stage_name]
+ t += "| Fuel Injection Stage: [stage_name], [stage_status[stage_name] ? "Active \[Enter cooldown\]" : "Cooling \[Begin injection\]"] |
"
+ for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
+ t += ""
+ t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
+ t += "[Injector.rate/10] Modify | "
+ t += "[Injector.fuel_usage*100]% Modify | "
+ t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
+ t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.percent_depleted]%" : ""] | "
+ t += "
"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=fuel_monitor;size=500x600")
+ user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm
index 6963b1f5be7..e773939c9f5 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm
@@ -97,59 +97,58 @@
return*/
interact(user)
- proc
- interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=fuel_injector")
- return
- var/t = "Reactor Core Fuel Injector
"
- t += "Stage: [stage]
"
- t += "Status: [injecting ? "Active \[Disable\]" : "Standby \[Enable\]"]
"
- t += "Interval (sec): [rate/10] \[Modify\]
"
- t += "Fuel usage: [fuel_usage*100]% \[Modify\]
"
- /*
- var/t = "Reactor Core Fuel Control
"
- t += "Current fuel injection stage: [active_stage]
"
- if(active_stage == "Cooling")
- //t += "Restart injection cycle
"
- t += "----
"
- else
- t += "Enter cooldown phase
"
- t += "Fuel depletion announcement: "
- t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
- t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
- t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
- t += "Stage progression announcement: "
- t += "[announce_stageprogression ? "Disable" : "Disabled"] "
- t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
- t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
- t += "
"
- t += ""
- t += "| Injector Status | "
- t += "Injection interval (sec) | "
- t += "Assembly consumption per injection | "
- t += "Fuel Assembly Port | "
- t += "Assembly depletion percentage | "
- t += "
"
- for(var/stage in fuel_injectors)
- var/list/cur_stage = fuel_injectors[stage]
- t += "| Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"] |
"
- for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
- t += ""
- t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
- t += "[Injector.rate/10] Modify | "
- t += "[Injector.fuel_usage*100]% Modify | "
- t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
- t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[100 - Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""] | "
- t += "
"
- t += "
"
- */
- t += "
"
- t += "Close
"
- user << browse(t, "window=fuel_injector;size=500x800")
- user.machine = src
+ interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=fuel_injector")
+ return
+ var/t = "Reactor Core Fuel Injector
"
+ t += "Stage: [stage]
"
+ t += "Status: [injecting ? "Active \[Disable\]" : "Standby \[Enable\]"]
"
+ t += "Interval (sec): [rate/10] \[Modify\]
"
+ t += "Fuel usage: [fuel_usage*100]% \[Modify\]
"
+ /*
+ var/t = "Reactor Core Fuel Control
"
+ t += "Current fuel injection stage: [active_stage]
"
+ if(active_stage == "Cooling")
+ //t += "Restart injection cycle
"
+ t += "----
"
+ else
+ t += "Enter cooldown phase
"
+ t += "Fuel depletion announcement: "
+ t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
+ t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
+ t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
+ t += "Stage progression announcement: "
+ t += "[announce_stageprogression ? "Disable" : "Disabled"] "
+ t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
+ t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
+ t += "
"
+ t += ""
+ t += "| Injector Status | "
+ t += "Injection interval (sec) | "
+ t += "Assembly consumption per injection | "
+ t += "Fuel Assembly Port | "
+ t += "Assembly depletion percentage | "
+ t += "
"
+ for(var/stage in fuel_injectors)
+ var/list/cur_stage = fuel_injectors[stage]
+ t += "| Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"] |
"
+ for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
+ t += ""
+ t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
+ t += "[Injector.rate/10] Modify | "
+ t += "[Injector.fuel_usage*100]% Modify | "
+ t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
+ t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[100 - Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""] | "
+ t += "
"
+ t += "
"
+ */
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=fuel_injector;size=500x800")
+ user.machine = src
proc/BeginInjecting()
if(!injecting && owned_assembly_port && owned_assembly_port.cur_assembly)
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm
index 69553a3d8f3..3926d840330 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm
@@ -163,36 +163,26 @@
pixel_x = -pixel_x
pixel_y = -pixel_y
- attack_ai(mob/user)
- attack_hand(user)
-
- attack_hand(mob/user)
- add_fingerprint(user)
- /*if(stat & (BROKEN|NOPOWER))
- return*/
- interact(user)
-
- proc
- interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=gyro_monitor")
- return
- var/t = "Free electron MASER (Gyrotron) Control Panel
"
- if(owned_gyrotron && owned_gyrotron.on)
- t += "Gyrotron operational
"
- t += "Operational mode: "
- if(owned_gyrotron.emitting)
- t += "Emitting \[Deactivate\]
"
- else
- t += "Not emitting \[Activate\]
"
- t += "Emission rate: [owned_gyrotron.rate] \[Modify\]
"
- t += "Beam frequency: [owned_gyrotron.frequency] \[Modify\]
"
- t += "Beam power: [owned_gyrotron.mega_energy] \[Modify\]
"
+ interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=gyro_monitor")
+ return
+ var/t = "Free electron MASER (Gyrotron) Control Panel
"
+ if(owned_gyrotron && owned_gyrotron.on)
+ t += "Gyrotron operational
"
+ t += "Operational mode: "
+ if(owned_gyrotron.emitting)
+ t += "Emitting \[Deactivate\]
"
else
- t += "Gyrotron unresponsive"
- t += "
"
- t += "Close
"
- user << browse(t, "window=gyro_monitor;size=500x800")
- user.machine = src
+ t += "Not emitting \[Activate\]
"
+ t += "Emission rate: [owned_gyrotron.rate] \[Modify\]
"
+ t += "Beam frequency: [owned_gyrotron.frequency] \[Modify\]
"
+ t += "Beam power: [owned_gyrotron.mega_energy] \[Modify\]
"
+ else
+ t += "Gyrotron unresponsive"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=gyro_monitor;size=500x800")
+ user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm
index 37bbed0e9ff..2c9b6f37d88 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm
@@ -7,20 +7,6 @@
New()
..()
- attack_ai(mob/user)
- attack_hand(user)
-
- attack_hand(mob/user)
- add_fingerprint(user)
- /*if(stat & (BROKEN|NOPOWER))
- return*/
- interact(user)
-
- /*updateDialog()
- for(var/mob/M in range(1))
- if(M.machine == src)
- interact(m)*/
-
Topic(href, href_list)
..()
if( href_list["close"] )
@@ -37,66 +23,65 @@
if(updating)
src.updateDialog()
- proc
- interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=gyrotron_controller")
- return
- var/t = "Gyrotron Remote Control Console
"
- t += "
"
- for(var/obj/machinery/rust/gyrotron/gyro in world)
- if(gyro.remoteenabled && gyro.on)
- t += "Gyrotron operational
"
- t += "Operational mode: "
- if(gyro.emitting)
- t += "Emitting \[Deactivate\]
"
- else
- t += "Not emitting \[Activate\]
"
- t += "Emission rate: [gyro.rate] \[Modify\]
"
- t += "Beam frequency: [gyro.frequency] \[Modify\]
"
- t += "Beam power: [gyro.mega_energy] \[Modify\]
"
+ interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=gyrotron_controller")
+ return
+ var/t = "Gyrotron Remote Control Console
"
+ t += "
"
+ for(var/obj/machinery/rust/gyrotron/gyro in world)
+ if(gyro.remoteenabled && gyro.on)
+ t += "Gyrotron operational
"
+ t += "Operational mode: "
+ if(gyro.emitting)
+ t += "Emitting \[Deactivate\]
"
else
- t += "Gyrotron unresponsive"
- t += "
"
- /*
- var/t = "Reactor Core Fuel Control
"
- t += "Current fuel injection stage: [active_stage]
"
- if(active_stage == "Cooling")
- //t += "Restart injection cycle
"
- t += "----
"
+ t += "Not emitting \[Activate\]
"
+ t += "Emission rate: [gyro.rate] \[Modify\]
"
+ t += "Beam frequency: [gyro.frequency] \[Modify\]
"
+ t += "Beam power: [gyro.mega_energy] \[Modify\]
"
else
- t += "Enter cooldown phase
"
- t += "Fuel depletion announcement: "
- t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
- t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
- t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
- t += "Stage progression announcement: "
- t += "[announce_stageprogression ? "Disable" : "Disabled"] "
- t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
- t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
+ t += "Gyrotron unresponsive"
t += "
"
- t += ""
- t += "| Injector Status | "
- t += "Injection interval (sec) | "
- t += "Assembly consumption per injection | "
- t += "Fuel Assembly Port | "
- t += "Assembly depletion percentage | "
- t += "
"
- for(var/stage in fuel_injectors)
- var/list/cur_stage = fuel_injectors[stage]
- t += "| Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"] |
"
- for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
- t += ""
- t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
- t += "[Injector.rate/10] Modify | "
- t += "[Injector.fuel_usage*100]% Modify | "
- t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
- t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""] | "
- t += "
"
- t += "
"
- */
- t += "Close
"
- user << browse(t, "window=gyrotron_controller;size=500x400")
- user.machine = src
+ /*
+ var/t = "Reactor Core Fuel Control
"
+ t += "Current fuel injection stage: [active_stage]
"
+ if(active_stage == "Cooling")
+ //t += "Restart injection cycle
"
+ t += "----
"
+ else
+ t += "Enter cooldown phase
"
+ t += "Fuel depletion announcement: "
+ t += "[announce_fueldepletion ? "Disable" : "Disabled"] "
+ t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] "
+ t += "[announce_fueldepletion == 2 ? "Broadcasting" : "Broadcast"]
"
+ t += "Stage progression announcement: "
+ t += "[announce_stageprogression ? "Disable" : "Disabled"] "
+ t += "[announce_stageprogression == 1 ? "Announcing" : "Announce"] "
+ t += "[announce_stageprogression == 2 ? "Broadcasting" : "Broadcast"] "
+ t += "
"
+ t += ""
+ t += "| Injector Status | "
+ t += "Injection interval (sec) | "
+ t += "Assembly consumption per injection | "
+ t += "Fuel Assembly Port | "
+ t += "Assembly depletion percentage | "
+ t += "
"
+ for(var/stage in fuel_injectors)
+ var/list/cur_stage = fuel_injectors[stage]
+ t += "| Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"] |
"
+ for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
+ t += ""
+ t += "| [Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"] | "
+ t += "[Injector.rate/10] Modify | "
+ t += "[Injector.fuel_usage*100]% Modify | "
+ t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ] | "
+ t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""] | "
+ t += "
"
+ t += "
"
+ */
+ t += "Close
"
+ user << browse(t, "window=gyrotron_controller;size=500x400")
+ user.machine = src
diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm b/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm
index 50017200cbb..d606337f4cb 100644
--- a/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Supermatter/LaserComputer.dm
@@ -14,36 +14,26 @@
if(las.id == src.id)
lasers += las
- attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER))
- return
- interact(user)
-
- attack_ai(mob/user)
- attack_hand(user)
-
process()
..()
updateDialog()
- proc
- interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=laser_control")
- return
- var/t = "Laser status monitor
"
- for(var/obj/machinery/zero_point_emitter/laser in lasers)
- t += "Zero Point Laser
"
- t += "Power level: - - - - [laser.energy]MeV + + + +
"
- t += "Frequency: - - [laser.freq] + +
"
- t += "Output: [laser.active ? "Online Offline" : "Online Offline "]
"
- t += "
"
- t += "Close
"
- user << browse(t, "window=laser_control;size=500x800")
- user.machine = src
+ interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=laser_control")
+ return
+ var/t = "Laser status monitor
"
+ for(var/obj/machinery/zero_point_emitter/laser in lasers)
+ t += "Zero Point Laser
"
+ t += "Power level: - - - - [laser.energy]MeV + + + +
"
+ t += "Frequency: - - [laser.freq] + +
"
+ t += "Output: [laser.active ? "Online Offline" : "Online Offline "]
"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=laser_control;size=500x800")
+ user.machine = src
/*
/obj/machinery/computer/lasercon/proc/interact(mob/user)
diff --git a/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm b/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm
index 6aca0fd18aa..bd7ccfd7737 100644
--- a/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm
+++ b/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm
@@ -119,10 +119,6 @@
if(M == user) continue
M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
-/obj/machinery/shield_capacitor/attack_hand(mob/user as mob)
- interact(user)
- src.add_fingerprint(user)
-
/obj/machinery/shield_capacitor/Topic(href, href_list[])
..()
if( href_list["close"] )
@@ -144,7 +140,7 @@
//
updateDialog()
-/obj/machinery/shield_capacitor/proc/interact(mob/user)
+/obj/machinery/shield_capacitor/interact(mob/user)
if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
if (!istype(user, /mob/living/silicon))
user.machine = null
diff --git a/code/WorkInProgress/Cael_Aislinn/shield_gen.dm b/code/WorkInProgress/Cael_Aislinn/shield_gen.dm
index c0327346f9c..c87fb4aab98 100644
--- a/code/WorkInProgress/Cael_Aislinn/shield_gen.dm
+++ b/code/WorkInProgress/Cael_Aislinn/shield_gen.dm
@@ -148,11 +148,6 @@
//
updateDialog()
-/obj/machinery/shield_gen/attack_hand(mob/user as mob)
-
- interact(user)
- src.add_fingerprint(user)
-
/obj/machinery/shield_gen/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
@@ -241,7 +236,7 @@
//
updateDialog()
-/obj/machinery/shield_gen/proc/interact(mob/user)
+/obj/machinery/shield_gen/interact(mob/user)
if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
if (!istype(user, /mob/living/silicon))
user.machine = null
diff --git a/code/WorkInProgress/Ported/Abi79/uplinks.dm b/code/WorkInProgress/Ported/Abi79/uplinks.dm
index 55cd988af8f..3cba4e3c6c7 100644
--- a/code/WorkInProgress/Ported/Abi79/uplinks.dm
+++ b/code/WorkInProgress/Ported/Abi79/uplinks.dm
@@ -31,7 +31,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
if(!uplink_data)
uplink_data = ticker.mode.uplink_items
- items = dd_replacetext(uplink_data, "\n", "") // Getting the text string of items
+ items = replacetext(uplink_data, "\n", "") // Getting the text string of items
ItemList = dd_text2list(src.items, ";") // Parsing the items text string
uses = ticker.mode.uplink_uses
diff --git a/code/WorkInProgress/Susan/biocraps.dmi b/code/WorkInProgress/Susan/biocraps.dmi
new file mode 100644
index 00000000000..1bcbec018fe
Binary files /dev/null and b/code/WorkInProgress/Susan/biocraps.dmi differ
diff --git a/code/WorkInProgress/Susan/desert.dmi b/code/WorkInProgress/Susan/desert.dmi
new file mode 100644
index 00000000000..439f5630f06
Binary files /dev/null and b/code/WorkInProgress/Susan/desert.dmi differ
diff --git a/code/WorkInProgress/Susan/susan_desert_turfs.dm b/code/WorkInProgress/Susan/susan_desert_turfs.dm
new file mode 100644
index 00000000000..472510abedd
--- /dev/null
+++ b/code/WorkInProgress/Susan/susan_desert_turfs.dm
@@ -0,0 +1,497 @@
+//this is everything i'm going to be using in my outpost zeta map, and possibly future maps.
+
+turf/unsimulated/desert
+ name = "desert"
+ icon = 'desert.dmi'
+ icon_state = "desert"
+ temperature = 393.15
+ luminosity = 5
+ brightness_on = 1
+ lighting_lumcount = 8
+
+turf/unsimulated/desert/New()
+ icon_state = "desert[rand(0,4)]"
+
+/area/awaymission/labs/researchdivision
+ name = "Research"
+ icon_state = "away3"
+
+/area/awaymission/labs/militarydivision
+ name = "Military"
+ icon_state = "away2"
+
+/area/awaymission/labs/gateway
+ name = "Gateway"
+ icon_state = "away1"
+
+/area/awaymission/labs/command
+ name = "Command"
+ icon_state = "away"
+
+/area/awaymission/labs/civilian
+ name = "Civilian"
+ icon_state = "away3"
+
+/area/awaymission/labs/cargo
+ name = "Cargo"
+ icon_state = "away2"
+
+/area/awaymission/labs/medical
+ name = "Medical"
+ icon_state = "away1"
+
+/area/awaymission/labs/security
+ name = "Security"
+ icon_state = "away"
+
+/area/awaymission/labs/solars
+ name = "Solars"
+ icon_state = "away3"
+
+/area/awaymission/labs/cave
+ name = "Caves"
+ icon_state = "away2"
+
+//corpses and possibly other decorative items
+
+/obj/effect/landmark/corpse/alien/New() //Creates a mob and checks for gear in each slot before attempting to equip it.
+ var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
+ M.dna.mutantrace = "lizard"
+ M.real_name = src.name
+ M.stat = 2 //Kills the new mob
+ if(src.corpseuniform)
+ M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
+ if(src.corpsesuit)
+ M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
+ if(src.corpseshoes)
+ M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
+ if(src.corpsegloves)
+ M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
+ if(src.corpseradio)
+ M.equip_to_slot_or_del(new src.corpseradio(M), slot_ears)
+ if(src.corpseglasses)
+ M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
+ if(src.corpsemask)
+ M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
+ if(src.corpsehelmet)
+ M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
+ if(src.corpsebelt)
+ M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
+ if(src.corpsepocket1)
+ M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
+ if(src.corpsepocket2)
+ M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
+ if(src.corpseback)
+ M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
+ if(src.corpseid == 1)
+ var/obj/item/weapon/card/id/W = new(M)
+ W.name = "[M.real_name]'s ID Card"
+ if(src.corpseidicon)
+ W.icon_state = corpseidicon
+ if(src.corpseidaccess)
+ W.access = get_access(corpseidaccess)
+ if(corpseidjob)
+ W.assignment = corpseidjob
+ W.registered_name = M.real_name
+ M.equip_to_slot_or_del(W, slot_wear_id)
+ del(src)
+
+/obj/effect/landmark/corpse/alien/cargo
+ name = "Cargo Technician"
+ corpseuniform = /obj/item/clothing/under/rank/cargo
+ corpseradio = /obj/item/device/radio/headset/headset_cargo
+ corpseid = 1
+ corpseidjob = "Cargo Technician"
+ corpseidaccess = "Quartermaster"
+
+/obj/effect/landmark/corpse/alien/laborer
+ name = "Laborer"
+ corpseuniform = /obj/item/clothing/under/overalls
+ corpseradio = /obj/item/device/radio/headset/headset_eng
+ corpseback = /obj/item/weapon/storage/backpack/industrial
+ corpsebelt = /obj/item/weapon/storage/belt/utility/full
+ corpsehelmet = /obj/item/clothing/head/hardhat
+ corpseid = 1
+ corpseidjob = "Laborer"
+ corpseidaccess = "Engineer"
+
+/obj/effect/landmark/corpse/alien/testsubject
+ name = "Unfortunate Test Subject"
+ corpseuniform = /obj/item/clothing/under/color/white
+ corpseid = 0
+
+/obj/effect/landmark/corpse/overseer
+ name = "Overseer"
+ corpseuniform = /obj/item/clothing/under/rank/navyhead_of_security
+ corpsesuit = /obj/item/clothing/suit/armor/hosnavycoat
+ corpseradio = /obj/item/device/radio/headset/heads/captain
+ corpsegloves = /obj/item/clothing/gloves/black/hos
+ corpseshoes = /obj/item/clothing/shoes/swat
+ corpsehelmet = /obj/item/clothing/head/beret/navyhos
+ corpseglasses = /obj/item/clothing/glasses/eyepatch
+ corpseid = 1
+ corpseidjob = "Facility Overseer"
+ corpseidaccess = "Captain"
+
+/obj/effect/landmark/corpse/officer
+ name = "Security Officer"
+ corpseuniform = /obj/item/clothing/under/rank/navysecurity
+ corpsesuit = /obj/item/clothing/suit/armor/navysecvest
+ corpseradio = /obj/item/device/radio/headset/headset_sec
+ corpseshoes = /obj/item/clothing/shoes/swat
+ corpsehelmet = /obj/item/clothing/head/beret/navysec
+ corpseid = 1
+ corpseidjob = "Security Officer"
+ corpseidaccess = "Security Officer"
+
+/*
+ * Weeds
+ */
+#define NODERANGE 1
+
+/obj/effect/alien/flesh/weeds
+ name = "Fleshy Growth"
+ desc = "A pulsating grouping of odd, alien tissues. It's almost like it has a heartbeat..."
+ icon = 'biocraps.dmi'
+ icon_state = "flesh"
+
+ anchored = 1
+ density = 0
+ var/health = 15
+ var/obj/effect/alien/weeds/node/linked_node = null
+
+/obj/effect/alien/flesh/weeds/node
+ icon_state = "fleshnode"
+ icon = 'biocraps.dmi'
+ name = "Throbbing Pustule"
+ desc = "A grotquese, oozing, pimple-like growth. You swear you can see something moving around in the bulb..."
+ luminosity = NODERANGE
+ var/node_range = NODERANGE
+
+/obj/effect/alien/flesh/weeds/node/New()
+ ..(src.loc, src)
+
+
+/obj/effect/alien/flesh/weeds/New(pos, node)
+ ..()
+ linked_node = node
+ if(istype(loc, /turf/space))
+ del(src)
+ return
+ if(icon_state == "flesh")icon_state = pick("flesh", "flesh1", "flesh2")
+ spawn(rand(150, 200))
+ if(src)
+ Life()
+ return
+
+/obj/effect/alien/flesh/weeds/proc/Life()
+ set background = 1
+ var/turf/U = get_turf(src)
+/*
+ if (locate(/obj/movable, U))
+ U = locate(/obj/movable, U)
+ if(U.density == 1)
+ del(src)
+ return
+
+Alien plants should do something if theres a lot of poison
+ if(U.poison> 200000)
+ health -= round(U.poison/200000)
+ update()
+ return
+*/
+ if (istype(U, /turf/space))
+ del(src)
+ return
+
+ direction_loop:
+ for(var/dirn in cardinal)
+ var/turf/T = get_step(src, dirn)
+
+ if (!istype(T) || T.density || locate(/obj/effect/alien/flesh/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
+ continue
+
+ if(!linked_node || get_dist(linked_node, src) > linked_node.node_range)
+ return
+
+ // if (locate(/obj/movable, T)) // don't propogate into movables
+ // continue
+
+ for(var/obj/O in T)
+ if(O.density)
+ continue direction_loop
+
+ new /obj/effect/alien/flesh/weeds(T, linked_node)
+
+
+/obj/effect/alien/flesh/weeds/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ if(2.0)
+ if (prob(50))
+ del(src)
+ if(3.0)
+ if (prob(5))
+ del(src)
+ return
+
+/obj/effect/alien/flesh/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
+ if(W.attack_verb.len)
+ visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
+ else
+ visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]")
+
+ var/damage = W.force / 4.0
+
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+
+ if(WT.remove_fuel(0, user))
+ damage = 15
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+
+ health -= damage
+ healthcheck()
+
+/obj/effect/alien/flesh/weeds/proc/healthcheck()
+ if(health <= 0)
+ del(src)
+
+
+/obj/effect/alien/flesh/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ health -= 5
+ healthcheck()
+
+/*/obj/effect/alien/weeds/burn(fi_amount)
+ if (fi_amount > 18000)
+ spawn( 0 )
+ del(src)
+ return
+ return 0
+ return 1
+*/
+
+#undef NODERANGE
+
+//clothing, weapons, and other items that can be worn or used in some way
+
+/obj/item/clothing/under/rank/navywarden
+ desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. It has the word \"Warden\" written on the shoulders."
+ name = "warden's jumpsuit"
+ icon_state = "wardendnavyclothes"
+ item_state = "wardendnavyclothes"
+ color = "wardendnavyclothes"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/under/rank/navysecurity
+ name = "security officer's jumpsuit"
+ desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection."
+ icon_state = "officerdnavyclothes"
+ item_state = "officerdnavyclothes"
+ color = "officerdnavyclothes"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/under/rank/navyhead_of_security
+ desc = "It's a jumpsuit worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer."
+ name = "head of security's jumpsuit"
+ icon_state = "hosdnavyclothes"
+ item_state = "hosdnavyclothes"
+ color = "hosdnavyclothes"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/suit/armor/hosnavycoat
+ name = "armored coat"
+ desc = "A coat enchanced with a special alloy for some protection and style."
+ icon_state = "hosdnavyjacket"
+ item_state = "armor"
+ armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+
+/obj/item/clothing/head/beret/navysec
+ name = "security beret"
+ desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety."
+ icon_state = "officerberet"
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/head/beret/navywarden
+ name = "warden's beret"
+ desc = "A beret with a two-colored security insignia emblazoned on it. For wardens that are more inclined towards style than safety."
+ icon_state = "wardenberet"
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/head/beret/navyhos
+ name = "security head's beret"
+ desc = "A stylish beret bearing a golden insignia that proudly displays the security coat of arms. A commander's must-have."
+ icon_state = "hosberet"
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/suit/armor/navysecvest
+ name = "armored coat"
+ desc = "An armored coat that protects against some damage."
+ icon_state = "officerdnavyjacket"
+ item_state = "armor"
+ flags = FPRINT | TABLEPASS
+ armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/armor/navywardenvest
+ name = "Warden's jacket"
+ desc = "An armoured jacket with silver rank pips and livery."
+ icon_state = "wardendnavyjacket"
+ item_state = "armor"
+ flags = FPRINT | TABLEPASS
+ armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+
+//hostile entities or npcs
+
+/obj/item/projectile/slimeglob
+ icon = 'projectiles.dmi'
+ icon_state = "toxin"
+ damage = 20
+ damage_type = BRUTE
+
+/obj/effect/critter/fleshmonster
+ name = "Fleshy Horror"
+ desc = "A grotesque, shambling fleshy horror... was this once a... a person?"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "horror"
+ health = 120
+ max_health = 120
+ aggressive = 1
+ defensive = 1
+ wanderer = 1
+ opensdoors = 1
+ atkcarbon = 1
+ atksilicon = 1
+ atkcritter = 1
+ atksame = 0
+ atkmech = 1
+ firevuln = 0.5
+ brutevuln = 1
+ seekrange = 25
+ armor = 15
+ melee_damage_lower = 12
+ melee_damage_upper = 17
+ angertext = "shambles"
+ attacktext = "slashes"
+ var/ranged = 0
+ var/rapid = 0
+ proc
+ Shoot(var/target, var/start, var/user, var/bullet = 0)
+ OpenFire(var/thing)//bluh ill rename this later or somethin
+
+
+ Die()
+ if (!src.alive) return
+ src.alive = 0
+ walk_to(src,0)
+ src.visible_message("[src] disintegrates into mush!")
+ playsound(loc, 'sound/voice/hiss6.ogg', 80, 1, 1)
+ var/turf/Ts = get_turf(src)
+ new /obj/effect/decal/cleanable/blood(Ts)
+ del(src)
+
+ seek_target()
+ src.anchored = 0
+ var/T = null
+ for(var/mob/living/C in view(src.seekrange,src))//TODO: mess with this
+ if (src.target)
+ src.task = "chasing"
+ break
+ if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
+ if(istype(C, /mob/living/carbon/) && !src.atkcarbon) continue
+ if(istype(C, /mob/living/silicon/) && !src.atksilicon) continue
+ if(C.health < 0) continue
+ if(istype(C, /mob/living/carbon/) && src.atkcarbon)
+ if(C:mind)
+ if(C:mind:special_role == "H.I.V.E")
+ continue
+ src.attack = 1
+ if(istype(C, /mob/living/silicon/) && src.atksilicon)
+ if(C:mind)
+ if(C:mind:special_role == "H.I.V.E")
+ continue
+ src.attack = 1
+ if(src.attack)
+ T = C
+ break
+
+ if(!src.attack)
+ for(var/obj/effect/critter/C in view(src.seekrange,src))
+ if(istype(C, /obj/effect/critter) && !src.atkcritter) continue
+ if(C.health <= 0) continue
+ if(istype(C, /obj/effect/critter) && src.atkcritter)
+ if((istype(C, /obj/effect/critter/hivebot) && !src.atksame) || (C == src)) continue
+ T = C
+ break
+
+ for(var/obj/mecha/M in view(src.seekrange,src))
+ if(istype(M, /obj/mecha) && !src.atkmech) continue
+ if(M.health <= 0) continue
+ if(istype(M, /obj/mecha) && src.atkmech) src.attack = 1
+ if(src.attack)
+ T = M
+ break
+
+ if(src.attack)
+ src.target = T
+ src.oldtarget_name = T:name
+ if(src.ranged)
+ OpenFire(T)
+ return
+ src.task = "chasing"
+ return
+
+
+ OpenFire(var/thing)
+ src.target = thing
+ src.oldtarget_name = thing:name
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [src] spits a glob at [src.target]!", 1)
+
+ var/tturf = get_turf(target)
+ if(rapid)
+ spawn(1)
+ Shoot(tturf, src.loc, src)
+ spawn(4)
+ Shoot(tturf, src.loc, src)
+ spawn(6)
+ Shoot(tturf, src.loc, src)
+ else
+ Shoot(tturf, src.loc, src)
+
+ src.attack = 0
+ sleep(12)
+ seek_target()
+ src.task = "thinking"
+ return
+
+
+ Shoot(var/target, var/start, var/user, var/bullet = 0)
+ if(target == start)
+ return
+
+ var/obj/item/projectile/slimeglob/A = new /obj/item/projectile/slimeglob(user:loc)
+ playsound(user, 'sound/weapons/bite.ogg', 100, 1)
+
+ if(!A) return
+
+ if (!istype(target, /turf))
+ del(A)
+ return
+ A.current = target
+ A.yo = target:y - start:y
+ A.xo = target:x - start:x
+ spawn( 0 )
+ A.process()
+ return
+
+obj/effect/critter/fleshmonster/fleshslime
+ name = "Flesh Slime"
+ icon = 'biocraps.dmi'
+ icon_state = "livingflesh"
+ desc = "A creature that appears to be made out of living tissue strewn together haphazardly. Some kind of liquid bubbles from its maw."
+ ranged = 1
\ No newline at end of file
diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm
index 0c42c913d50..5e4a45e21ae 100644
--- a/code/WorkInProgress/buildmode.dm
+++ b/code/WorkInProgress/buildmode.dm
@@ -149,13 +149,13 @@
if(objholder in removed_paths)
alert("That path is not allowed.")
objholder = "/obj/structure/closet"
- else if (dd_hasprefix(objholder, "/mob") && !(usr.client.holder.rank in list("Game Master", "Game Admin", "Badmin")))
+ else if (dd_hasprefix(objholder, "/mob") && !check_rights(R_DEBUG,0))
objholder = "/obj/structure/closet"
if(3)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
- if(master.buildmode.varholder in locked && !(usr.client.holder.rank in list("Game Master", "Game Admin")))
+ if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0))
return
var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference")
if(!thetype) return
@@ -186,28 +186,28 @@
if(istype(object,/turf) && pa.Find("left") && !pa.Find("alt") && !pa.Find("ctrl") )
if(istype(object,/turf/space))
var/turf/T = object
- T.ReplaceWithFloor()
+ T.ChangeTurf(/turf/simulated/floor)
return
else if(istype(object,/turf/simulated/floor))
var/turf/T = object
- T.ReplaceWithWall()
+ T.ChangeTurf(/turf/simulated/wall)
return
else if(istype(object,/turf/simulated/wall))
var/turf/T = object
- T.ReplaceWithRWall()
+ T.ChangeTurf(/turf/simulated/wall/r_wall)
return
else if(pa.Find("right"))
if(istype(object,/turf/simulated/wall))
var/turf/T = object
- T.ReplaceWithFloor()
+ T.ChangeTurf(/turf/simulated/floor)
return
else if(istype(object,/turf/simulated/floor))
var/turf/T = object
- T.ReplaceWithSpace()
+ T.ChangeTurf(/turf/space)
return
else if(istype(object,/turf/simulated/wall/r_wall))
var/turf/T = object
- T.ReplaceWithWall()
+ T.ChangeTurf(/turf/simulated/wall)
return
else if(istype(object,/obj))
del(object)
@@ -235,7 +235,6 @@
if(pa.Find("left"))
var/obj/A = new holder.buildmode.objholder (get_turf(object))
A.dir = holder.builddir.dir
- blink(A)
else if(pa.Find("right"))
if(isobj(object)) del(object)
@@ -244,14 +243,12 @@
if(object.vars.Find(holder.buildmode.varholder))
log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
object.vars[holder.buildmode.varholder] = holder.buildmode.valueholder
- blink(object)
else
usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'"
if(pa.Find("right"))
if(object.vars.Find(holder.buildmode.varholder))
log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
object.vars[holder.buildmode.varholder] = initial(object.vars[holder.buildmode.varholder])
- blink(object)
else
usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'"
@@ -262,8 +259,3 @@
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
-/proc/blink(atom/A)
- A.icon += rgb(0,75,75)
- spawn(5)
- if(A)
- A.icon = initial(A.icon)
diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm
index ea94d4f8bfd..3ad76272466 100644
--- a/code/WorkInProgress/surgery.dm
+++ b/code/WorkInProgress/surgery.dm
@@ -122,7 +122,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
/datum/surgery_step/generic/clamp_bleeders
required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/weapon/mousetrap)
+ allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
min_duration = 40
max_duration = 60
@@ -558,7 +558,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
/datum/surgery_step/eye/mend_eyes
required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/weapon/mousetrap)
+ allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
min_duration = 80
max_duration = 100
@@ -651,7 +651,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
/datum/surgery_step/face/mend_vocal
required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/weapon/mousetrap)
+ allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
min_duration = 70
max_duration = 90
diff --git a/code/ZAS/Variable Settings.dm b/code/ZAS/Variable Settings.dm
index 9b02ec553e6..592be10d067 100644
--- a/code/ZAS/Variable Settings.dm
+++ b/code/ZAS/Variable Settings.dm
@@ -280,8 +280,8 @@ pl_control
else if(istext(vars["[V]_RANDOM"]))
var/txt = vars["[V]_RANDOM"]
if(findtextEx(txt,"PROB"))
- txt = dd_text2list(txt,"/")
- txt[1] = dd_replacetext(txt[1],"PROB","")
+ txt = text2list(txt,"/")
+ txt[1] = replacetext(txt[1],"PROB","")
var/p = text2num(txt[1])
var/r = txt[2]
if(prob(p))
@@ -289,8 +289,8 @@ pl_control
else
newvalue = vars[V]
else if(findtextEx(txt,"PICK"))
- txt = dd_replacetext(txt,"PICK","")
- txt = dd_text2list(txt,",")
+ txt = replacetext(txt,"PICK","")
+ txt = text2list(txt,",")
newvalue = pick(txt)
else
newvalue = roll(txt)
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
new file mode 100644
index 00000000000..955c5ba300a
--- /dev/null
+++ b/code/__HELPERS/files.dm
@@ -0,0 +1,18 @@
+//checks if a file exists and contains text
+//returns text as a string if these conditions are met
+/proc/return_file_text(filename)
+ if(fexists(filename) == 0)
+ error("File not found ([filename])")
+ return
+
+ var/text = file2text(filename)
+ if(!text)
+ error("File empty ([filename])")
+ return
+
+ return text
+
+//Sends resource files to client cache
+/mob/proc/getFiles()
+ for(var/file in args)
+ src << browse_rsc(file)
\ No newline at end of file
diff --git a/code/defines/procs/gamehelpers.dm b/code/__HELPERS/game.dm
similarity index 84%
rename from code/defines/procs/gamehelpers.dm
rename to code/__HELPERS/game.dm
index 864cc3666fe..ab258c8e328 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/__HELPERS/game.dm
@@ -280,7 +280,6 @@ proc/isInSight(var/atom/A, var/atom/B)
if(M.ckey == lowertext(key))
return M
return null
-
proc/check_can_reach(atom/user, atom/target)
if(!in_range(user,target))
return 0
@@ -320,3 +319,33 @@ var/list/DummyCache = list()
D.loc = null
DummyCache.Add(D)
return 1
+
+// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
+
+/proc/get_active_candidates(var/buffer = 1)
+
+ var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
+ var/i = 0
+ while(candidates.len <= 0 && i < 5)
+ for(var/mob/dead/observer/G in player_list)
+ if(((G.client.inactivity/10)/60) <= buffer + i) // the most active players are more likely to become an alien
+ if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
+ candidates += G.key
+ i++
+ return candidates
+
+// Same as above but for alien candidates.
+
+/proc/get_alien_candidates()
+
+ var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
+ var/i = 0
+ while(candidates.len <= 0 && i < 5)
+ for(var/mob/dead/observer/G in player_list)
+ if(G.client.be_alien)
+ if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
+ if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
+ candidates += G.key
+ i++
+ return candidates
+
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
new file mode 100644
index 00000000000..f683c47e06e
--- /dev/null
+++ b/code/__HELPERS/global_lists.dm
@@ -0,0 +1,36 @@
+var/list/clients = list() //list of all clients
+var/list/admins = list() //list of all clients whom are admins
+var/list/directory = list() //list of all ckeys with associated client
+
+//Since it didn't really belong in any other category, I'm putting this here
+//This is for procs to replace all the goddamn 'in world's that are chilling around the code
+
+var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player
+var/global/list/mob_list = list() //List of all mobs, including clientless
+var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player
+var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player
+
+var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time
+var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
+var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
+var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
+var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
+var/global/list/landmarks_list = list() //list of all landmarks created
+
+//////////////////////////
+/////Initial Building/////
+//////////////////////////
+
+/proc/make_datum_references_lists()
+ var/list/paths
+ //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name
+ paths = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
+ for(var/path in paths)
+ var/datum/sprite_accessory/hair/H = new path()
+ hair_styles_list[H.name] = H
+ //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name
+ paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
+ for(var/path in paths)
+ var/datum/sprite_accessory/facial_hair/H = new path()
+ facial_hair_styles_list[H.name] = H
+
diff --git a/code/defines/procs/icon_procs.dm b/code/__HELPERS/icons.dm
similarity index 62%
rename from code/defines/procs/icon_procs.dm
rename to code/__HELPERS/icons.dm
index ce56408ead4..cfca598adbc 100644
--- a/code/defines/procs/icon_procs.dm
+++ b/code/__HELPERS/icons.dm
@@ -1,8 +1,217 @@
/*
- IconProcs
- by Lummox JR
- Check the icon_procs_readme.dm for how they work.
- */
+IconProcs README
+
+A BYOND library for manipulating icons and colors
+
+by Lummox JR
+
+version 1.0
+
+The IconProcs library was made to make a lot of common icon operations much easier. BYOND's icon manipulation
+routines are very capable but some of the advanced capabilities like using alpha transparency can be unintuitive to beginners.
+
+CHANGING ICONS
+
+Several new procs have been added to the /icon datum to simplify working with icons. To use them,
+remember you first need to setup an /icon var like so:
+
+var/icon/my_icon = new('iconfile.dmi')
+
+icon/ChangeOpacity(amount = 1)
+ A very common operation in DM is to try to make an icon more or less transparent. Making an icon more
+ transparent is usually much easier than making it less so, however. This proc basically is a frontend
+ for MapColors() which can change opacity any way you like, in much the same way that SetIntensity()
+ can make an icon lighter or darker. If amount is 0.5, the opacity of the icon will be cut in half.
+ If amount is 2, opacity is doubled and anything more than half-opaque will become fully opaque.
+icon/GrayScale()
+ Converts the icon to grayscale instead of a fully colored icon. Alpha values are left intact.
+icon/ColorTone(tone)
+ Similar to GrayScale(), this proc converts the icon to a range of black -> tone -> white, where tone is an
+ RGB color (its alpha is ignored). This can be used to create a sepia tone or similar effect.
+ See also the global ColorTone() proc.
+icon/MinColors(icon)
+ The icon is blended with a second icon where the minimum of each RGB pixel is the result.
+ Transparency may increase, as if the icons were blended with ICON_ADD. You may supply a color in place of an icon.
+icon/MaxColors(icon)
+ The icon is blended with a second icon where the maximum of each RGB pixel is the result.
+ Opacity may increase, as if the icons were blended with ICON_OR. You may supply a color in place of an icon.
+icon/Opaque(background = "#000000")
+ All alpha values are set to 255 throughout the icon. Transparent pixels become black, or whatever background color you specify.
+icon/BecomeAlphaMask()
+ You can convert a simple grayscale icon into an alpha mask to use with other icons very easily with this proc.
+ The black parts become transparent, the white parts stay white, and anything in between becomes a translucent shade of white.
+icon/AddAlphaMask(mask)
+ The alpha values of the mask icon will be blended with the current icon. Anywhere the mask is opaque,
+ the current icon is untouched. Anywhere the mask is transparent, the current icon becomes transparent.
+ Where the mask is translucent, the current icon becomes more transparent.
+icon/UseAlphaMask(mask, mode)
+ Sometimes you may want to take the alpha values from one icon and use them on a different icon.
+ This proc will do that. Just supply the icon whose alpha mask you want to use, and src will change
+ so it has the same colors as before but uses the mask for opacity.
+
+COLOR MANAGEMENT AND HSV
+
+RGB isn't the only way to represent color. Sometimes it's more useful to work with a model called HSV, which stands for hue, saturation, and value.
+
+ * The hue of a color describes where it is along the color wheel. It goes from red to yellow to green to
+ cyan to blue to magenta and back to red.
+ * The saturation of a color is how much color is in it. A color with low saturation will be more gray,
+ and with no saturation at all it is a shade of gray.
+ * The value of a color determines how bright it is. A high-value color is vivid, moderate value is dark,
+ and no value at all is black.
+
+Just as BYOND uses "#rrggbb" to represent RGB values, a similar format is used for HSV: "#hhhssvv". The hue is three
+hex digits because it ranges from 0 to 0x5FF.
+
+ * 0 to 0xFF - red to yellow
+ * 0x100 to 0x1FF - yellow to green
+ * 0x200 to 0x2FF - green to cyan
+ * 0x300 to 0x3FF - cyan to blue
+ * 0x400 to 0x4FF - blue to magenta
+ * 0x500 to 0x5FF - magenta to red
+
+Knowing this, you can figure out that red is "#000ffff" in HSV format, which is hue 0 (red), saturation 255 (as colorful as possible),
+value 255 (as bright as possible). Green is "#200ffff" and blue is "#400ffff".
+
+More than one HSV color can match the same RGB color.
+
+Here are some procs you can use for color management:
+
+ReadRGB(rgb)
+ Takes an RGB string like "#ffaa55" and converts it to a list such as list(255,170,85). If an RGBA format is used
+ that includes alpha, the list will have a fourth item for the alpha value.
+hsv(hue, sat, val, apha)
+ Counterpart to rgb(), this takes the values you input and converts them to a string in "#hhhssvv" or "#hhhssvvaa"
+ format. Alpha is not included in the result if null.
+ReadHSV(rgb)
+ Takes an HSV string like "#100FF80" and converts it to a list such as list(256,255,128). If an HSVA format is used that
+ includes alpha, the list will have a fourth item for the alpha value.
+RGBtoHSV(rgb)
+ Takes an RGB or RGBA string like "#ffaa55" and converts it into an HSV or HSVA color such as "#080aaff".
+HSVtoRGB(hsv)
+ Takes an HSV or HSVA string like "#080aaff" and converts it into an RGB or RGBA color such as "#ff55aa".
+BlendRGB(rgb1, rgb2, amount)
+ Blends between two RGB or RGBA colors using regular RGB blending. If amount is 0, the first color is the result;
+ if 1, the second color is the result. 0.5 produces an average of the two. Values outside the 0 to 1 range are allowed as well.
+ The returned value is an RGB or RGBA color.
+BlendHSV(hsv1, hsv2, amount)
+ Blends between two HSV or HSVA colors using HSV blending, which tends to produce nicer results than regular RGB
+ blending because the brightness of the color is left intact. If amount is 0, the first color is the result; if 1,
+ the second color is the result. 0.5 produces an average of the two. Values outside the 0 to 1 range are allowed as well.
+ The returned value is an HSV or HSVA color.
+BlendRGBasHSV(rgb1, rgb2, amount)
+ Like BlendHSV(), but the colors used and the return value are RGB or RGBA colors. The blending is done in HSV form.
+HueToAngle(hue)
+ Converts a hue to an angle range of 0 to 360. Angle 0 is red, 120 is green, and 240 is blue.
+AngleToHue(hue)
+ Converts an angle to a hue in the valid range.
+RotateHue(hsv, angle)
+ Takes an HSV or HSVA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360.
+ (Rotating red by 60° produces yellow.) The result is another HSV or HSVA color with the same saturation and value
+ as the original, but a different hue.
+GrayScale(rgb)
+ Takes an RGB or RGBA color and converts it to grayscale. Returns an RGB or RGBA string.
+ColorTone(rgb, tone)
+ Similar to GrayScale(), this proc converts an RGB or RGBA color to a range of black -> tone -> white instead of
+ using strict shades of gray. The tone value is an RGB color; any alpha value is ignored.
+*/
+
+/*
+Get Flat Icon DEMO by DarkCampainger
+
+This is a test for the get flat icon proc, modified approprietly for icons and their states.
+Probably not a good idea to run this unless you want to see how the proc works in detail.
+mob
+ icon = 'old_or_unused.dmi'
+ icon_state = "green"
+
+ Login()
+ // Testing image underlays
+ underlays += image(icon='old_or_unused.dmi',icon_state="red")
+ underlays += image(icon='old_or_unused.dmi',icon_state="red", pixel_x = 32)
+ underlays += image(icon='old_or_unused.dmi',icon_state="red", pixel_x = -32)
+
+ // Testing image overlays
+ overlays += image(icon='old_or_unused.dmi',icon_state="green", pixel_x = 32, pixel_y = -32)
+ overlays += image(icon='old_or_unused.dmi',icon_state="green", pixel_x = 32, pixel_y = 32)
+ overlays += image(icon='old_or_unused.dmi',icon_state="green", pixel_x = -32, pixel_y = -32)
+
+ // Testing icon file overlays (defaults to mob's state)
+ overlays += '_flat_demoIcons2.dmi'
+
+ // Testing icon_state overlays (defaults to mob's icon)
+ overlays += "white"
+
+ // Testing dynamic icon overlays
+ var/icon/I = icon('old_or_unused.dmi', icon_state="aqua")
+ I.Shift(NORTH,16,1)
+ overlays+=I
+
+ // Testing dynamic image overlays
+ I=image(icon=I,pixel_x = -32, pixel_y = 32)
+ overlays+=I
+
+ // Testing object types (and layers)
+ overlays+=/obj/effect/overlayTest
+
+ loc = locate (10,10,1)
+ verb
+ Browse_Icon()
+ set name = "1. Browse Icon"
+ // Give it a name for the cache
+ var/iconName = "[ckey(src.name)]_flattened.dmi"
+ // Send the icon to src's local cache
+ src<