Merge branch 'master' of https://github.com/tgstation/-tg-station into 13/10/2013-Limb/organ-stuff

This probably broke everything... :(
This commit is contained in:
Robson Richards
2013-11-17 18:09:14 +00:00
1098 changed files with 13467 additions and 8827 deletions
+4 -5
View File
@@ -1,13 +1,13 @@
/tg/station 13 v1.0 - 6 October 2010
Website:http://nanotrasen.com
Website: http://ss13.eu
Code: https://github.com/tgstation/-tg-station
IRC: irc://irc.rizon.net/coderbus
================================================================================
DOWNLOADING
================================================================================
There are a number of ways to download the source code.
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://wiki.ss13.eu/index.php/Downloading_the_source_code
Option 1: Download the source code as a zip by clicking the ZIP button in the
code tab of https://github.com/tgstation/-tg-station
@@ -23,7 +23,7 @@ Then you simply search for the -tg-station repository and click the big clone
button.
Option 3:
Follow this: http://baystation12.net/wiki/index.php?title=Installing_TortoiseGit
Follow this: http://wiki.ss13.eu/index.php/Setting_up_git
(It's recommended that you use git-scm, as above, rather than the git CLI
suggested by the guide)
@@ -91,8 +91,7 @@ SQL SETUP
The SQL backend for the library and stats tracking requires a
MySQL server. Your server details go in /config/dbconfig.txt, and the SQL
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are
coming soon, for now ask in our IRC channel.
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are located here: http://wiki.ss13.eu/index.php/Downloading_the_source_code#Setting_up_the_database
================================================================================
IRC BOT SETUP
+15
View File
@@ -0,0 +1,15 @@
4 November 2013, by Errorage
The column 'deleted' was added to the erro_library table. If set to anything other than null, the book is interpreted as deleted.
To update your database, execute the following code in phpmyadmin, mysql workbench or whatever program you use:
ALTER TABLE erro_library ADD COLUMN deleted TINYINT(1) NULL DEFAULT NULL AFTER datetime;
If you want to 'soft delete' a book (meaning it remains in the library, but isn't viewable by players), set the value in the 'deleted' column for the row to 1. To undelete, set it back to null. If you're making an admin tool to work with this, execute the following SQL statement to soft-delete the book with id someid:
UPDATE erro_library SET deleted = 1 WHERE id = someid
(Replace someid with the id of the book you want to soft delete.)
----------------------------------------------------
+1
View File
@@ -174,6 +174,7 @@ CREATE TABLE `erro_library` (
`category` varchar(45) NOT NULL,
`ckey` varchar(45) DEFAULT 'LEGACY',
`datetime` datetime DEFAULT NULL,
`deleted` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+33 -1
View File
@@ -16,6 +16,7 @@ obj/machinery/atmospherics
active_power_usage = 0
power_channel = ENVIRON
var/nodealert = 0
var/can_unwrench = 0
@@ -54,4 +55,35 @@ obj/machinery/atmospherics/proc/return_network_air(datum/network/reference)
obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference)
obj/machinery/atmospherics/update_icon()
return null
return null
obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(can_unwrench && istype(W, /obj/item/weapon/wrench))
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
add_fingerprint(user)
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
var/obj/item/pipe/newpipe = new(loc, make_from=src)
transfer_fingerprints_to(newpipe)
if(istype(src, /obj/machinery/atmospherics/pipe))
for(var/obj/machinery/meter/meter in T)
if(meter.target == src)
new /obj/item/pipe_meter(T)
del(meter)
del(src)
else
return ..()
@@ -7,6 +7,8 @@ obj/machinery/atmospherics/binary/passive_gate
name = "Passive gate"
desc = "A one-way air valve that does not require power"
can_unwrench = 1
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
@@ -166,23 +168,4 @@ obj/machinery/atmospherics/binary/passive_gate
if (on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
@@ -19,6 +19,8 @@ obj/machinery/atmospherics/binary/pump
name = "Gas pump"
desc = "A pump"
can_unwrench = 1
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
@@ -178,22 +180,5 @@ obj/machinery/atmospherics/binary/pump
if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
@@ -19,6 +19,8 @@ obj/machinery/atmospherics/binary/volume_pump
name = "Volumetric gas pump"
desc = "A volumetric pump"
can_unwrench = 1
var/on = 0
var/transfer_rate = 200
@@ -177,23 +179,4 @@ obj/machinery/atmospherics/binary/volume_pump
if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
@@ -8,6 +8,8 @@
dir = SOUTH
initialize_directions = SOUTH
can_unwrench = 1
var/obj/machinery/portable_atmospherics/connected_device
var/obj/machinery/atmospherics/node
@@ -137,24 +139,4 @@
if (connected_device)
user << "\red You cannot unwrench this [src], dettach [connected_device] first."
return 1
if (locate(/obj/machinery/portable_atmospherics, src.loc))
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
@@ -7,6 +7,8 @@ obj/machinery/atmospherics/trinary/filter
req_access = list(access_atmospherics)
can_unwrench = 1
var/on = 0
var/temp = null // -- TLE
@@ -134,31 +136,7 @@ Filter types:
initialize()
set_frequency(frequency)
..()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
if(..())
@@ -7,6 +7,8 @@ obj/machinery/atmospherics/trinary/mixer
req_access = list(access_atmospherics)
can_unwrench = 1
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
@@ -95,29 +97,6 @@ obj/machinery/atmospherics/trinary/mixer
return 1
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
attack_hand(user as mob)
if(..())
return
@@ -7,6 +7,8 @@
name = "Heat Exchanger"
desc = "Exchanges heat between two input gases. Setup for fast heat transfer"
can_unwrench = 1
var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null
var/update_cycle
@@ -64,26 +66,3 @@
partner.network.update = 1
return 1
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
@@ -6,6 +6,8 @@
desc = "Has a valve and pump attached to it"
use_power = 1
can_unwrench = 1
var/area/initial_loc
level = 1
var/area_uid
@@ -312,25 +314,7 @@
if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
/obj/machinery/atmospherics/unary/vent_pump/Del()
if(initial_loc)
@@ -8,6 +8,8 @@
level = 1
can_unwrench = 1
var/area/initial_loc
var/id_tag = null
var/frequency = 1439
@@ -248,25 +250,7 @@
if (!(stat & NOPOWER) && on)
user << "\red You cannot unwrench this [src], turn it off first."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
/obj/machinery/atmospherics/unary/vent_scrubber/Del()
if(initial_loc)
+3 -19
View File
@@ -8,6 +8,8 @@ obj/machinery/atmospherics/valve
dir = SOUTH
initialize_directions = SOUTH|NORTH
can_unwrench = 1
var/open = 0
var/openDuringInit = 0
@@ -317,22 +319,4 @@ obj/machinery/atmospherics/valve
if (istype(src, /obj/machinery/atmospherics/valve/digital))
user << "\red You cannot unwrench this [src], it's too complicated."
return 1
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
return ..()
+9 -31
View File
@@ -9,6 +9,8 @@ obj/machinery/atmospherics/pipe
layer = 2.4 //under wires with their 2.44
use_power = 0
can_unwrench = 1
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
@@ -337,12 +339,14 @@ obj/machinery/atmospherics/pipe
name = "Pressure Tank"
desc = "A large vessel containing pressurized gas."
volume = 2000 //in liters, 1 meters by 1 meters by 2 meters
volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
dir = SOUTH
initialize_directions = SOUTH
density = 1
can_unwrench = 0
var/obj/machinery/atmospherics/node1
New()
@@ -500,6 +504,8 @@ obj/machinery/atmospherics/pipe
dir = SOUTH
initialize_directions = SOUTH
can_unwrench = 0
var/build_killswitch = 1
var/obj/machinery/atmospherics/node1
@@ -805,35 +811,7 @@ obj/machinery/atmospherics/pipe
icon_state = "manifold-y-f"
obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (istype(src, /obj/machinery/atmospherics/pipe/tank))
return ..()
else if (istype(src, /obj/machinery/atmospherics/pipe/vent))
return ..()
else if (istype(W, /obj/item/weapon/wrench))
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
for (var/obj/machinery/meter/meter in T)
if (meter.target == src)
new /obj/item/pipe_meter(T)
del(meter)
del(src)
else if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1)
if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1)
atmosanalyzer_scan(parent.air, user)
else
return ..()
return ..()
+2 -2
View File
@@ -79,7 +79,7 @@
location.assume_air(affected)
for(var/atom/item in loc)
if(item) // It's possible that the item is deleted in temperature_expose
if(item && item != src) // It's possible that the item is deleted in temperature_expose
item.fire_act(null, temperature, volume)
return 0
@@ -175,7 +175,7 @@
air_update_turf()
return
/obj/effect/hotspot/HasEntered(mob/living/L)
/obj/effect/hotspot/Crossed(mob/living/L)
..()
if(isliving(L))
L.fire_act()
+2
View File
@@ -24,6 +24,8 @@ datum/controller/air_system
setup_allturfs()
global_activeturfs = active_turfs.len
world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!"
/datum/controller/air_system/proc/process()
-470
View File
@@ -1,470 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
//As a host, you should probably leave these defines alone.
//They define low-level stuff you don't really want/need to mess with
#define PI 3.1415
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
#define SPEED_OF_LIGHT 3e8 //not exact but hey!
#define SPEED_OF_LIGHT_SQ 9e+16
#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215)
#define AIR_DAMAGE_MODIFIER 2.025 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025)
#define INFINITY 1e31 //closer then enough
//atmos
#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol)
#define ONE_ATMOSPHERE 101.325 //kPa
#define T0C 273.15 // 0degC
#define T20C 293.15 // 20degC
#define TCMB 2.7 // -270.3degC
#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC
#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005)
#define O2STANDARD 0.21
#define N2STANDARD 0.79
#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%)
#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%)
//ITEM INVENTORY SLOT BITMASKS
#define SLOT_OCLOTHING 1
#define SLOT_ICLOTHING 2
#define SLOT_GLOVES 4
#define SLOT_EYES 8
#define SLOT_EARS 16
#define SLOT_MASK 32
#define SLOT_HEAD 64
#define SLOT_FEET 128
#define SLOT_ID 256
#define SLOT_BELT 512
#define SLOT_BACK 1024
#define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets.
#define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets.
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
#define TABLEPASS 2 // can pass by a table or rack ~ apparently actually unused, uses pass_flags instead
#define MASKINTERNALS 8 // mask allows internals
//#define SUITSPACE 8 // suit protects against space
#define USEDELAY 16 // For adding extra delay to heavy items, not currently used
#define NOSHIELD 32 // weapon not affected by shield
#define CONDUCT 64 // conducts electricity (metal etc.)
#define FPRINT 256 // takes a fingerprint
#define ON_BORDER 512 // item has priority to check when entering or leaving
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define NOBLOODY 2048 // used by objects that don't want to get bloodied
#define GLASSESCOVERSEYES 1024
#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags
#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes
#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head
#define HEADCOVERSMOUTH 2048
#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc
#define OPENCONTAINER 4096 // is an open container for chemistry purposes
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
#define ONESIZEFITSALL 8192 // can be worn by fatties (or children? ugh) --jumpsuit only (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
#define NOREACT 16384 //Reagents dont' react inside this container.
#define BLOCKHAIR 32768 // temporarily removes the user's hair icon
//flags for pass_flags
#define PASSTABLE 1
#define PASSGLASS 2
#define PASSGRILLE 4
#define PASSBLOB 8
//turf-only flags
#define NOJAUNT 1
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDEMASK 1 //APPLIES ONLY TO HELMETS/MASKS!!
#define HIDEEARS 2 //APPLIES ONLY TO HELMETS/MASKS!! (ears means headsets and such)
#define HIDEEYES 4 //APPLIES ONLY TO HELMETS/MASKS!! (eyes means glasses)
#define HIDEFACE 8 //APPLIES ONLY TO HELMETS/MASKS!! Dictates whether we appear as unknown.
//slots
#define slot_back 1
#define slot_wear_mask 2
#define slot_handcuffed 3
#define slot_l_hand 4
#define slot_r_hand 5
#define slot_belt 6
#define slot_wear_id 7
#define slot_ears 8
#define slot_glasses 9
#define slot_gloves 10
#define slot_head 11
#define slot_shoes 12
#define slot_wear_suit 13
#define slot_w_uniform 14
#define slot_l_store 15
#define slot_r_store 16
#define slot_s_store 17
#define slot_in_backpack 18
#define slot_legcuffed 19
//Cant seem to find a mob bitflags area other than the powers one
// bitflags for clothing parts
#define HEAD 1
#define CHEST 2
#define GROIN 4
#define LEG_LEFT 8
#define LEG_RIGHT 16
#define LEGS 24
#define FOOT_LEFT 32
#define FOOT_RIGHT 64
#define FEET 96
#define ARM_LEFT 128
#define ARM_RIGHT 256
#define ARMS 384
#define HAND_LEFT 512
#define HAND_RIGHT 1024
#define HANDS 1536
#define FULL_BODY 2047
// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
// The values here should add up to 1.
// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
#define THERMAL_PROTECTION_HEAD 0.3
#define THERMAL_PROTECTION_CHEST 0.15
#define THERMAL_PROTECTION_GROIN 0.15
#define THERMAL_PROTECTION_LEG_LEFT 0.075
#define THERMAL_PROTECTION_LEG_RIGHT 0.075
#define THERMAL_PROTECTION_FOOT_LEFT 0.025
#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
#define THERMAL_PROTECTION_ARM_LEFT 0.075
#define THERMAL_PROTECTION_ARM_RIGHT 0.075
#define THERMAL_PROTECTION_HAND_LEFT 0.025
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
//bitflags for mutations
// Extra powers:
#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%)
#define SCREAM (1<<11) // supersonic screaming (25%)
#define EXPLOSIVE (1<<12) // exploding on-demand (15%)
#define REGENERATION (1<<13) // superhuman regeneration (30%)
#define REPROCESSOR (1<<14) // eat anything (50%)
#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%)
#define PHASING (1<<16) // ability to phase through walls (40%)
#define SHIELD (1<<17) // shielding from all projectile attacks (30%)
#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%)
// String identifiers for associative list lookup
// mob/var/list/mutations
// Generic mutations:
#define TK 1
#define COLD_RESISTANCE 2
#define XRAY 3
#define HULK 4
#define CLUMSY 5
#define FAT 6
#define HUSK 7
#define NOCLONE 8
// Extra powers:
#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
#define HEAL 10 // healing people with hands
#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%)
#define SCREAM 12 // supersonic screaming (25%)
#define EXPLOSIVE 13 // exploding on-demand (15%)
#define REGENERATION 14 // superhuman regeneration (30%)
#define REPROCESSOR 15 // eat anything (50%)
#define SHAPESHIFTING 16 // take on the appearance of anything (40%)
#define PHASING 17 // ability to phase through walls (40%)
#define SHIELD 18 // shielding from all projectile attacks (30%)
#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
#define ELECTRICITY 20 // ability to shoot electric attacks (15%)
//disabilities
#define NEARSIGHTED 1
#define EPILEPSY 2
#define COUGHING 4
#define TOURETTES 8
#define NERVOUS 16
//sdisabilities
#define BLIND 1
#define MUTE 2
#define DEAF 4
//mob/var/stat things
#define CONSCIOUS 0
#define UNCONSCIOUS 1
#define DEAD 2
// channel numbers for power
#define EQUIP 1
#define LIGHT 2
#define ENVIRON 3
#define TOTAL 4 //for total power used only
// bitflags for machine stat variable
#define BROKEN 1
#define NOPOWER 2
#define POWEROFF 4 // tbd
#define MAINT 8 // under maintaince
#define EMPED 16 // temporary broken by EMP pulse
//bitflags for door switches.
#define OPEN 1
#define IDSCAN 2
#define BOLTS 4
#define SHOCK 8
#define SAFE 16
#define GAS_O2 (1 << 0)
#define GAS_N2 (1 << 1)
#define GAS_PL (1 << 2)
#define GAS_CO2 (1 << 3)
#define GAS_N2O (1 << 4)
var/list/accessable_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60)
//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
//(Exceptions: extended, sandbox and nuke) -Errorage
//Was list("3" = 30, "4" = 70).
//Spacing should be a reliable method of getting rid of a body -- Urist.
//Go away Urist, I'm restoring this to the longer list. ~Errorage
#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE))))
var/list/global_mutations = list() // list of hidden mutation things
//Bluh shields
//Damage things //TODO: merge these down to reduce on defines
//Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc...
#define BRUTE "brute"
#define BURN "fire"
#define TOX "tox"
#define OXY "oxy"
#define CLONE "clone"
#define HALLOSS "halloss"
#define STUN "stun"
#define WEAKEN "weaken"
#define PARALYZE "paralize"
#define IRRADIATE "irradiate"
#define STUTTER "stutter"
#define EYE_BLUR "eye_blur"
#define DROWSY "drowsy"
//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches
#define BRUTELOSS 1
#define FIRELOSS 2
#define TOXLOSS 4
#define OXYLOSS 8
//Bitflags defining which status effects could be or are inflicted on a mob
#define CANSTUN 1
#define CANWEAKEN 2
#define CANPARALYSE 4
#define CANPUSH 8
#define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy.
var/static/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg','sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
//Grab levels
#define GRAB_PASSIVE 1
#define GRAB_AGGRESSIVE 2
#define GRAB_NECK 3
#define GRAB_UPGRADING 4
#define GRAB_KILL 5
//Security levels
#define SEC_LEVEL_GREEN 0
#define SEC_LEVEL_BLUE 1
#define SEC_LEVEL_RED 2
#define SEC_LEVEL_DELTA 3
//A set of constants used to determine which type of mute an admin wishes to apply:
//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1)
//Therefore there needs to be a gap between the flags for the automute flags
#define MUTE_IC 1
#define MUTE_OOC 2
#define MUTE_PRAY 4
#define MUTE_ADMINHELP 8
#define MUTE_DEADCHAT 16
#define MUTE_ALL 31
//Some constants for DB_Ban
#define BANTYPE_PERMA 1
#define BANTYPE_TEMP 2
#define BANTYPE_JOB_PERMA 3
#define BANTYPE_JOB_TEMP 4
#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban.
#define BANTYPE_APPEARANCE 6
#define BANTYPE_ADMIN_PERMA 7
#define BANTYPE_ADMIN_TEMP 8
#define SEE_INVISIBLE_MINIMUM 5
#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15
#define INVISIBILITY_LIGHTING 20
#define SEE_INVISIBLE_LIVING 25
#define SEE_INVISIBLE_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized.
#define INVISIBILITY_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized.
#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
#define INVISIBILITY_OBSERVER 60
#define SEE_INVISIBLE_OBSERVER 60
#define INVISIBILITY_MAXIMUM 100
#define BORGMESON 1
#define BORGTHERM 2
#define BORGXRAY 4
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to
// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages
// tagged for the Cargo Bay.
var/list/TAGGERLOCATIONS = list("Disposals",
"Cargo Bay", "QM Office", "Engineering", "CE Office",
"Atmospherics", "Security", "HoS Office", "Medbay",
"CMO Office", "Chemistry", "Research", "RD Office",
"Robotics", "HoP Office", "Library", "Chapel", "Theatre",
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")
#define HOSTILE_STANCE_IDLE 1
#define HOSTILE_STANCE_ALERT 2
#define HOSTILE_STANCE_ATTACK 3
#define HOSTILE_STANCE_ATTACKING 4
#define HOSTILE_STANCE_TIRED 5
//Please don't edit these values without speaking to Errorage first ~Carn
//Admin Permissions
#define R_BUILDMODE 1
#define R_ADMIN 2
#define R_BAN 4
#define R_FUN 8
#define R_SERVER 16
#define R_DEBUG 32
#define R_POSSESS 64
#define R_PERMISSIONS 128
#define R_STEALTH 256
#define R_REJUVINATE 512
#define R_VAREDIT 1024
#define R_SOUNDS 2048
#define R_SPAWN 4096
#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
//Preference toggles
#define SOUND_ADMINHELP 1
#define SOUND_MIDI 2
#define SOUND_AMBIENCE 4
#define SOUND_LOBBY 8
#define CHAT_OOC 16
#define CHAT_DEAD 32
#define CHAT_GHOSTEARS 64
#define CHAT_GHOSTSIGHT 128
#define CHAT_PRAYER 256
#define CHAT_RADIO 512
#define MEMBER_PUBLIC 1024
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC)
#define BE_TRAITOR 1
#define BE_OPERATIVE 2
#define BE_CHANGELING 4
#define BE_WIZARD 8
#define BE_MALF 16
#define BE_REV 32
#define BE_ALIEN 64
#define BE_PAI 128
#define BE_CULTIST 256
#define BE_MONKEY 512
#define BE_NINJA 1024
var/list/be_special_flags = list(
"Traitor" = BE_TRAITOR,
"Operative" = BE_OPERATIVE,
"Changeling" = BE_CHANGELING,
"Wizard" = BE_WIZARD,
"Malf AI" = BE_MALF,
"Revolutionary" = BE_REV,
"Alien Lifeform" = BE_ALIEN,
"pAI" = BE_PAI,
"Cultist" = BE_CULTIST,
"Monkey" = BE_MONKEY,
"Ninja" = BE_NINJA
)
// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans.
#define HEALTH_HUD 1 // dead, alive, sick, health status
#define STATUS_HUD 2 // a simple line rounding the mob's number health
#define ID_HUD 3 // the job asigned to your ID
#define WANTED_HUD 4 // wanted, released, parroled, security status
#define IMPLOYAL_HUD 5 // loyality implant
#define IMPCHEM_HUD 6 // chemical implant
#define IMPTRACK_HUD 7 // tracking implant
#define MANIFEST_ERROR_NAME 1
#define MANIFEST_ERROR_COUNT 2
#define MANIFEST_ERROR_ITEM 4
//DNA - Because fuck you and your magic numbers being all over the codebase.
#define DNA_BLOCK_SIZE 3
#define DNA_UNI_IDENTITY_BLOCKS 7
#define DNA_HAIR_COLOR_BLOCK 1
#define DNA_FACIAL_HAIR_COLOR_BLOCK 2
#define DNA_SKIN_TONE_BLOCK 3
#define DNA_EYE_COLOR_BLOCK 4
#define DNA_GENDER_BLOCK 5
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
#define DNA_HAIR_STYLE_BLOCK 7
#define DNA_STRUC_ENZYMES_BLOCKS 14
#define DNA_UNIQUE_ENZYMES_LEN 32
//Transformation proc stuff
#define TR_KEEPITEMS 1
#define TR_KEEPVIRUS 2
#define TR_KEEPDAMAGE 4
#define TR_HASHNAME 8 // hashing names (e.g. monkey(e34f)) (only in monkeyize)
#define TR_KEEPIMPLANTS 16
#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_DEFAULTMSG 64
#define TR_KEEPSRC 128
#define ORGAN_ORGANIC 1
#define ORGAN_ROBOTIC 2
+14
View File
@@ -0,0 +1,14 @@
/*
This folder is full of #define statements. They are similar to constants,
but must come before any code that references them, and they do not take up
memory the way constants do.
The values in this folder are NOT options. They are not for hosts to play with.
Some of the values are arbitrary and only need to be different from similar constants;
for example, the genetic mutation numbers in genetics.dm mean nothing, but MUST be distinct.
It is wise not to touch them unless you understand what they do, where they're used,
and most importantly,
how to undo your changes if you screw it up.
- Sayu
*/
+37
View File
@@ -0,0 +1,37 @@
//A set of constants used to determine which type of mute an admin wishes to apply:
//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1)
//Therefore there needs to be a gap between the flags for the automute flags
#define MUTE_IC 1
#define MUTE_OOC 2
#define MUTE_PRAY 4
#define MUTE_ADMINHELP 8
#define MUTE_DEADCHAT 16
#define MUTE_ALL 31
//Some constants for DB_Ban
#define BANTYPE_PERMA 1
#define BANTYPE_TEMP 2
#define BANTYPE_JOB_PERMA 3
#define BANTYPE_JOB_TEMP 4
#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban.
#define BANTYPE_APPEARANCE 6
#define BANTYPE_ADMIN_PERMA 7
#define BANTYPE_ADMIN_TEMP 8
//Please don't edit these values without speaking to Errorage first ~Carn
//Admin Permissions
#define R_BUILDMODE 1
#define R_ADMIN 2
#define R_BAN 4
#define R_FUN 8
#define R_SERVER 16
#define R_DEBUG 32
#define R_POSSESS 64
#define R_PERMISSIONS 128
#define R_STEALTH 256
#define R_REJUVINATE 512
#define R_VAREDIT 1024
#define R_SOUNDS 2048
#define R_SPAWN 4096
#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+109
View File
@@ -0,0 +1,109 @@
#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215)
#define AIR_DAMAGE_MODIFIER 2.025 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025)
#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC
#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005)
#define O2STANDARD 0.21
#define N2STANDARD 0.79
#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%)
#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%)
#define GAS_O2 (1 << 0)
#define GAS_N2 (1 << 1)
#define GAS_PL (1 << 2)
#define GAS_CO2 (1 << 3)
#define GAS_N2O (1 << 4)
//stuff you should probably leave well alone!
//ATMOS
#define CELL_VOLUME 2500 //liters in a cell
#define BREATH_VOLUME 0.5 //liters in a normal breath
#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile
#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences
#define NORMPIPERATE 30 //pipe-insulation rate divisor
#define HEATPIPERATE 8 //heat-exch pipe insulation
#define FLOWFRAC 0.99 //fraction of gas transfered per process
#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //Tank starts leaking
#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere
#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion
#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold
#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 //Minimum ratio of air that must move to/from a tile to suspend group processing
#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended
#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active
#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously)
#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012
#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended
#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal
#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10
#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200
#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4
#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0
#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0
#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat
#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4
#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now
//Must be between 0 and 1. Values closer to 1 equalize temperature faster
//Should not exceed 0.4 else strange heat flow occur
#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C
#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
#define FIRE_GROWTH_RATE 40000 //For small fires
#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage
#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage
//Plasma fire properties
#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
#define PLASMA_UPPER_TEMPERATURE 1370+T0C
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
#define PLASMA_OXYGEN_FULLBURN 10
#define MIN_PLASMA_DAMAGE 1
#define MAX_PLASMA_DAMAGE 10
#define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible
// Pressure limits.
#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant)
#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE)
#define WARNING_LOW_PRESSURE 50 //This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE)
#define HAZARD_LOW_PRESSURE 20 //This is when the black ultra-low pressure icon is displayed. (This one is set as a constant)
#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount.
#define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
#define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50.
#define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
#define BODYTEMP_HEAT_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
#define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area.
#define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area.
#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat.
#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness.
#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0.
#define SPACE_HELM_MAX_TEMP_PROTECT 1500 //Thermal insulation works both ways /Malkevin
#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0.
#define SPACE_SUIT_MAX_TEMP_PROTECT 1500
#define FIRE_SUIT_MIN_TEMP_PROTECT 60 //Cold protection for firesuits
#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 //what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0.
#define FIRE_HELM_MIN_TEMP_PROTECT 60 //Cold protection for fire helmets
#define FIRE_HELM_MAX_TEMP_PROTECT 30000 //for fire helmet quality items (red and white hardhats)
#define HELMET_MIN_TEMP_PROTECT 160 //For normal helmets
#define HELMET_MAX_TEMP_PROTECT 600 //For normal helmets
#define ARMOR_MIN_TEMP_PROTECT 160 //For armor
#define ARMOR_MAX_TEMP_PROTECT 600 //For armor
#define GLOVES_MIN_TEMP_PROTECT 2.0 //For some gloves (black and)
#define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves
#define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves
#define SHOES_MAX_TEMP_PROTECT 1500 //For gloves
#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :(
#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure.
#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure.
+82
View File
@@ -0,0 +1,82 @@
//ITEM INVENTORY SLOT BITMASKS
#define SLOT_OCLOTHING 1
#define SLOT_ICLOTHING 2
#define SLOT_GLOVES 4
#define SLOT_EYES 8
#define SLOT_EARS 16
#define SLOT_MASK 32
#define SLOT_HEAD 64
#define SLOT_FEET 128
#define SLOT_ID 256
#define SLOT_BELT 512
#define SLOT_BACK 1024
#define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets.
#define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets.
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDEMASK 1 //APPLIES ONLY TO HELMETS/MASKS!!
#define HIDEEARS 2 //APPLIES ONLY TO HELMETS/MASKS!! (ears means headsets and such)
#define HIDEEYES 4 //APPLIES ONLY TO HELMETS/MASKS!! (eyes means glasses)
#define HIDEFACE 8 //APPLIES ONLY TO HELMETS/MASKS!! Dictates whether we appear as unknown.
//slots
#define slot_back 1
#define slot_wear_mask 2
#define slot_handcuffed 3
#define slot_l_hand 4
#define slot_r_hand 5
#define slot_belt 6
#define slot_wear_id 7
#define slot_ears 8
#define slot_glasses 9
#define slot_gloves 10
#define slot_head 11
#define slot_shoes 12
#define slot_wear_suit 13
#define slot_w_uniform 14
#define slot_l_store 15
#define slot_r_store 16
#define slot_s_store 17
#define slot_in_backpack 18
#define slot_legcuffed 19
//Cant seem to find a mob bitflags area other than the powers one
// bitflags for clothing parts - also used for limbs
#define HEAD 1
#define CHEST 2
#define GROIN 4
#define LEG_LEFT 8
#define LEG_RIGHT 16
#define LEGS 24
#define FOOT_LEFT 32
#define FOOT_RIGHT 64
#define FEET 96
#define ARM_LEFT 128
#define ARM_RIGHT 256
#define ARMS 384
#define HAND_LEFT 512
#define HAND_RIGHT 1024
#define HANDS 1536
#define FULL_BODY 2047
// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
// The values here should add up to 1.
// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
#define THERMAL_PROTECTION_HEAD 0.3
#define THERMAL_PROTECTION_CHEST 0.15
#define THERMAL_PROTECTION_GROIN 0.15
#define THERMAL_PROTECTION_LEG_LEFT 0.075
#define THERMAL_PROTECTION_LEG_RIGHT 0.075
#define THERMAL_PROTECTION_FOOT_LEFT 0.025
#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
#define THERMAL_PROTECTION_ARM_LEFT 0.075
#define THERMAL_PROTECTION_ARM_RIGHT 0.075
#define THERMAL_PROTECTION_HAND_LEFT 0.025
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
+47
View File
@@ -0,0 +1,47 @@
//Damage things //TODO: merge these down to reduce on defines
//Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc...
#define BRUTE "brute"
#define BURN "fire"
#define TOX "tox"
#define OXY "oxy"
#define CLONE "clone"
#define HALLOSS "halloss"
#define STUN "stun"
#define WEAKEN "weaken"
#define PARALYZE "paralize"
#define IRRADIATE "irradiate"
#define STUTTER "stutter"
#define EYE_BLUR "eye_blur"
#define DROWSY "drowsy"
//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches
#define BRUTELOSS 1
#define FIRELOSS 2
#define TOXLOSS 4
#define OXYLOSS 8
//Bitflags defining which status effects could be or are inflicted on a mob
#define CANSTUN 1
#define CANWEAKEN 2
#define CANPARALYSE 4
#define CANPUSH 8
#define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy.
//Grab levels
#define GRAB_PASSIVE 1
#define GRAB_AGGRESSIVE 2
#define GRAB_NECK 3
#define GRAB_UPGRADING 4
#define GRAB_KILL 5
#define HOSTILE_STANCE_IDLE 1
#define HOSTILE_STANCE_ALERT 2
#define HOSTILE_STANCE_ATTACK 3
#define HOSTILE_STANCE_ATTACKING 4
#define HOSTILE_STANCE_TIRED 5
+49
View File
@@ -0,0 +1,49 @@
/*
These defines are specific to the atom/flags bitmask
*/
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
#define TABLEPASS 2 // can pass by a table or rack ~ apparently actually unused, uses pass_flags instead
#define MASKINTERNALS 8 // mask allows internals
//#define SUITSPACE 8 // suit protects against space
#define USEDELAY 16 // For adding extra delay to heavy items, not currently used
#define NOSHIELD 32 // weapon not affected by shield
#define CONDUCT 64 // conducts electricity (metal etc.)
#define FPRINT 256 // takes a fingerprint
#define ON_BORDER 512 // item has priority to check when entering or leaving
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define NOBLOODY 65535 // used by objects that don't want to get bloodied
#define GLASSESCOVERSEYES 1024
#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags
#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes
#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head
#define HEADCOVERSMOUTH 2048
#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc
#define OPENCONTAINER 4096 // is an open container for chemistry purposes
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
#define ONESIZEFITSALL 8192 // can be worn by fatties (or children? ugh) --jumpsuit only (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
#define NOREACT 16384 //Reagents dont' react inside this container.
#define BLOCKHAIR 32768 // temporarily removes the user's hair icon
//turf-only flags
#define NOJAUNT 1
/*
These defines are used specifically with the atom/pass_flags bitmask
the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example)
*/
//flags for pass_flags
#define PASSTABLE 1
#define PASSGLASS 2
#define PASSGRILLE 4
#define PASSBLOB 8
+83
View File
@@ -0,0 +1,83 @@
//bitflags for mutations
// Extra powers:
#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%)
#define SCREAM (1<<11) // supersonic screaming (25%)
#define EXPLOSIVE (1<<12) // exploding on-demand (15%)
#define REGENERATION (1<<13) // superhuman regeneration (30%)
#define REPROCESSOR (1<<14) // eat anything (50%)
#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%)
#define PHASING (1<<16) // ability to phase through walls (40%)
#define SHIELD (1<<17) // shielding from all projectile attacks (30%)
#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%)
// String identifiers for associative list lookup
// mob/var/list/mutations
// Generic mutations:
#define TK 1
#define COLD_RESISTANCE 2
#define XRAY 3
#define HULK 4
#define CLUMSY 5
#define FAT 6
#define HUSK 7
#define NOCLONE 8
// Extra powers:
#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
#define HEAL 10 // healing people with hands
#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%)
#define SCREAM 12 // supersonic screaming (25%)
#define EXPLOSIVE 13 // exploding on-demand (15%)
#define REGENERATION 14 // superhuman regeneration (30%)
#define REPROCESSOR 15 // eat anything (50%)
#define SHAPESHIFTING 16 // take on the appearance of anything (40%)
#define PHASING 17 // ability to phase through walls (40%)
#define SHIELD 18 // shielding from all projectile attacks (30%)
#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
#define ELECTRICITY 20 // ability to shoot electric attacks (15%)
//disabilities
#define NEARSIGHTED 1
#define EPILEPSY 2
#define COUGHING 4
#define TOURETTES 8
#define NERVOUS 16
//sdisabilities
#define BLIND 1
#define MUTE 2
#define DEAF 4
//DNA - Because fuck you and your magic numbers being all over the codebase.
#define DNA_BLOCK_SIZE 3
#define DNA_UNI_IDENTITY_BLOCKS 7
#define DNA_HAIR_COLOR_BLOCK 1
#define DNA_FACIAL_HAIR_COLOR_BLOCK 2
#define DNA_SKIN_TONE_BLOCK 3
#define DNA_EYE_COLOR_BLOCK 4
#define DNA_GENDER_BLOCK 5
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
#define DNA_HAIR_STYLE_BLOCK 7
#define DNA_STRUC_ENZYMES_BLOCKS 14
#define DNA_UNIQUE_ENZYMES_LEN 32
//Transformation proc stuff
#define TR_KEEPITEMS 1
#define TR_KEEPVIRUS 2
#define TR_KEEPDAMAGE 4
#define TR_HASHNAME 8 // hashing names (e.g. monkey(e34f)) (only in monkeyize)
#define TR_KEEPIMPLANTS 16
#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_DEFAULTMSG 64
#define TR_KEEPSRC 128
//Organ stuff, It's here because "Genetics" is the most relevant file for organs
#define ORGAN_ORGANIC 1
#define ORGAN_ROBOTIC 2
+13
View File
@@ -0,0 +1,13 @@
// channel numbers for power
#define EQUIP 1
#define LIGHT 2
#define ENVIRON 3
#define TOTAL 4 //for total power used only
//bitflags for door switches.
#define OPEN 1
#define IDSCAN 2
#define BOLTS 4
#define SHOCK 8
#define SAFE 16
+11
View File
@@ -0,0 +1,11 @@
#define PI 3.1415
#define SPEED_OF_LIGHT 3e8 //not exact but hey!
#define SPEED_OF_LIGHT_SQ 9e+16
#define INFINITY 1e31 //closer then enough
//atmos
#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol)
#define ONE_ATMOSPHERE 101.325 //kPa
#define T0C 273.15 // 0degC
#define T20C 293.15 // 20degC
#define TCMB 2.7 // -270.3degC
+16
View File
@@ -0,0 +1,16 @@
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
//Security levels
#define SEC_LEVEL_GREEN 0
#define SEC_LEVEL_BLUE 1
#define SEC_LEVEL_RED 2
#define SEC_LEVEL_DELTA 3
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
#define MANIFEST_ERROR_NAME 1
#define MANIFEST_ERROR_COUNT 2
#define MANIFEST_ERROR_ITEM 4
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
+27
View File
@@ -0,0 +1,27 @@
//Preference toggles
#define SOUND_ADMINHELP 1
#define SOUND_MIDI 2
#define SOUND_AMBIENCE 4
#define SOUND_LOBBY 8
#define CHAT_OOC 16
#define CHAT_DEAD 32
#define CHAT_GHOSTEARS 64
#define CHAT_GHOSTSIGHT 128
#define CHAT_PRAYER 256
#define CHAT_RADIO 512
#define MEMBER_PUBLIC 1024
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC)
#define BE_TRAITOR 1
#define BE_OPERATIVE 2
#define BE_CHANGELING 4
#define BE_WIZARD 8
#define BE_MALF 16
#define BE_REV 32
#define BE_ALIEN 64
#define BE_PAI 128
#define BE_CULTIST 256
#define BE_MONKEY 512
#define BE_NINJA 1024
+32
View File
@@ -0,0 +1,32 @@
#define SEE_INVISIBLE_MINIMUM 5
#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15
#define INVISIBILITY_LIGHTING 20
#define SEE_INVISIBLE_LIVING 25
#define SEE_INVISIBLE_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized.
#define INVISIBILITY_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized.
#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
#define INVISIBILITY_OBSERVER 60
#define SEE_INVISIBLE_OBSERVER 60
#define INVISIBILITY_MAXIMUM 100
#define BORGMESON 1
#define BORGTHERM 2
#define BORGXRAY 4
// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans.
#define HEALTH_HUD 1 // dead, alive, sick, health status
#define STATUS_HUD 2 // a simple line rounding the mob's number health
#define ID_HUD 3 // the job asigned to your ID
#define WANTED_HUD 4 // wanted, released, parroled, security status
#define IMPLOYAL_HUD 5 // loyality implant
#define IMPCHEM_HUD 6 // chemical implant
#define IMPTRACK_HUD 7 // tracking implant
+15
View File
@@ -0,0 +1,15 @@
/*
Used with the various stat variables (mob, machines)
*/
//mob/var/stat things
#define CONSCIOUS 0
#define UNCONSCIOUS 1
#define DEAD 2
// bitflags for machine stat variable
#define BROKEN 1
#define NOPOWER 2
#define POWEROFF 4 // tbd
#define MAINT 8 // under maintaince
#define EMPED 16 // temporary broken by EMP pulse
+64 -7
View File
@@ -280,12 +280,16 @@ proc/isInSight(var/atom/A, var/atom/B)
// 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_candidates(be_special_flag=0)
. = list()
for(var/mob/dead/observer/G in player_list)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
if(!G.client.is_afk() && (G.client.prefs.be_special & be_special_flag))
. += G.client
/proc/get_candidates(be_special_flag=0, afk_bracket=3000)
var/list/candidates = list()
// Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
while(!candidates.len && afk_bracket < 6000)
for(var/mob/dead/observer/G in player_list)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag))
candidates += G.client
afk_bracket += 600 // Add a minute to the bracket, for every attempt
return candidates
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
if(!isobj(O)) O = new /obj/screen/text()
@@ -310,4 +314,57 @@ proc/isInSight(var/atom/A, var/atom/B)
C.images += I
sleep(duration)
for(var/client/C in show_to)
C.images -= I
C.images -= I
/proc/get_active_player_count()
// Get active players who are playing in the round
var/active_players = 0
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
if(M && M.client)
if(istype(M, /mob/new_player)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
if(O.started_as_observer) // Exclude people who started as observers
continue
active_players++
return active_players
/datum/projectile_data
var/src_x
var/src_y
var/time
var/distance
var/power_x
var/power_y
var/dest_x
var/dest_y
/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \
var/power_x, var/power_y, var/dest_x, var/dest_y)
src.src_x = src_x
src.src_y = src_y
src.time = time
src.distance = distance
src.power_x = power_x
src.power_y = power_y
src.dest_x = dest_x
src.dest_y = dest_y
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
// rotated at [rotation] and with the power of [power]
// Thanks to VistaPOWA for this function
var/power_x = power * cos(angle)
var/power_y = power * sin(angle)
var/time = 2* power_y / 10 //10 = g
var/distance = time * power_x
var/dest_x = src_x + distance*sin(rotation);
var/dest_y = src_y + distance*cos(rotation);
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
-39
View File
@@ -1,42 +1,3 @@
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/joined_player_list = list() //List of all clients that have joined the game at round-start or as a latejoin.
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/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
var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path.
var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none.
var/global/list/portals = list() //for use by portals
//Preferences stuff
//Hairstyles
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
var/global/list/hair_styles_male_list = list() //stores only hair names
var/global/list/hair_styles_female_list = list() //stores only hair names
var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
var/global/list/facial_hair_styles_male_list = list() //stores only hair names
var/global/list/facial_hair_styles_female_list = list() //stores only hair names
//Underwear
var/global/list/underwear_all = list() //stores /datum/sprite_accessory/underwear indexed by name
var/global/list/underwear_m = list() //stores only underwear name
var/global/list/underwear_f = list() //stores only underwear name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//Female Uniforms
var/global/list/female_uniform_icons = list()
//////////////////////////
/////Initial Building/////
//////////////////////////
+8
View File
@@ -106,6 +106,14 @@ var/const/Sqrt2 = 1.41421356
// Pi / 180
return degrees * 0.0174532925
// Will filter out extra rotations and negative rotations
// E.g: 540 becomes 180. -180 becomes 180.
/proc/SimplifyDegrees(degrees)
degrees = degrees % 360
if(degrees < 0)
degrees += 360
return degrees
// min is inclusive, max is exclusive
/proc/Wrap(val, min, max)
var/d = max - min
+56 -5
View File
@@ -189,10 +189,7 @@ proc/tg_list2text(list/list, glue=",")
//Converts an angle (degrees) into an ss13 direction
/proc/angle2dir(var/degree)
// Will filter out extra rotations and negative rotations
// E.g: 540 becomes 180. -180 becomes 180.
// Thanks to Flexicode for the formula.
degree = ((degree % 360 + 22.5) + 360) % 365
degree = SimplifyDegrees(degree)
if(degree < 45) return NORTH
if(degree < 90) return NORTHEAST
@@ -299,4 +296,58 @@ proc/tg_list2text(list/list, glue=",")
if(6*hue < 1) return (a+(b-a)*6*hue)
if(2*hue < 1) return b
if(3*hue < 2) return (a+(b-a)*((2/3)-hue)*6)
return a
return a
// Very ugly, BYOND doesn't support unix time and rounding errors make it really hard to convert it to BYOND time.
// returns "YYYY-MM-DD" by default
/proc/unix2date(timestamp, seperator = "-")
if(timestamp < 0)
return 0 //Do not accept negative values
var/year = 1970 //Unix Epoc begins 1970-01-01
var/dayInSeconds = 86400 //60secs*60mins*24hours
var/daysInYear = 365 //Non Leap Year
var/daysInLYear = daysInYear + 1//Leap year
var/days = round(timestamp / dayInSeconds) //Days passed since UNIX Epoc
var/tmpDays = days + 1 //If passed (timestamp < dayInSeconds), it will return 0, so add 1
var/monthsInDays = list() //Months will be in here ***Taken from the PHP source code***
var/month = 1 //This will be the returned MONTH NUMBER.
var/day //This will be the returned day number.
while(tmpDays > daysInYear) //Start adding years to 1970
year++
if(isLeap(year))
tmpDays -= daysInLYear
else
tmpDays -= daysInYear
if(isLeap(year)) //The year is a leap year
monthsInDays = list(-1,30,59,90,120,151,181,212,243,273,304,334)
else
monthsInDays = list(0,31,59,90,120,151,181,212,243,273,304,334)
var/mDays = 0;
var/monthIndex = 0;
for(var/m in monthsInDays)
monthIndex++
if(tmpDays > m)
mDays = m
month = monthIndex
day = tmpDays - mDays //Setup the date
return "[year][seperator][((month < 10) ? "0[month]" : month)][seperator][((day < 10) ? "0[day]" : day)]"
/*
var/list/test_times = list("December" = 1323522004, "August" = 1123522004, "January" = 1011522004,
"Jan Leap" = 946684800, "Jan Normal" = 978307200, "New Years Eve" = 1009670400,
"New Years" = 1009836000, "New Years 2" = 1041372000, "New Years 3" = 1104530400,
"July Month End" = 744161003, "July Month End 12" = 1343777003, "End July" = 1091311200)
for(var/t in test_times)
world.log << "TEST: [t] is [unix2date(test_times[t])]"
*/
/proc/isLeap(y)
return ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0))
+3 -1
View File
@@ -901,11 +901,13 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
if(toupdate.len)
for(var/turf/simulated/T1 in toupdate)
air_master.remove_from_active(T1)
T1.CalculateAdjacentTurfs()
air_master.add_to_active(T1,1)
if(fromupdate.len)
for(var/turf/simulated/T2 in fromupdate)
air_master.remove_from_active(T2)
T2.CalculateAdjacentTurfs()
air_master.add_to_active(T2,1)
@@ -1253,4 +1255,4 @@ var/list/WALLITEMS = list(
user << "\blue Temperature: [round(air_contents.temperature-T0C)]&deg;C"
else
user << "\blue [target] is empty!"
return
return
+12 -117
View File
@@ -1,5 +1,4 @@
//DEBUGGING
#define DEBUG //Enables byond profiling and full runtime logs
#define DEBUG //Enables byond profiling and full runtime logs - note, this may also be defined in your .dme file
//#define dellogging //Enables logging of forced del() calls (used for debugging)
//#define TESTING //Enables in-depth debug messages to runtime log (used for debugging)
//By using the testing("message") proc you can create debug-feedback for people with this
@@ -10,29 +9,17 @@
1 to use the default behaviour;
2 for preloading absolutely everything;
*/
//SYSTEM TOGGLES - these allow you to compile the game without some of the laggier systems if your server cannot cope with demand
/* Not yet coded
#define USE_DYNAMIC_GRAVITY //Enables the dynamic gravity system
#define USE_DYNAMIC_LIGHTING //Enables the dynamic lighting system
#define USE_DYNAMIC_ATMOS //Enables the dynamic atmos system
*/
//ADMIN STUFF
#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
#define SPAM_TRIGGER_WARNING 5 //Number of identical messages required before the spam-prevention will warn you to stfu
#define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 1024
#define MAX_NAME_LEN 26
#define MAX_BROADCAST_LEN 512
//MINOR TWEAKS/MISC
#define AGE_MIN 17 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
@@ -48,108 +35,9 @@
#define MAX_STACK_AMOUNT_GLASS 50
#define MAX_STACK_AMOUNT_RODS 60
// AI Toggles
#define AI_CAMERA_LUMINOSITY 5
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
#define shuttle_time_in_station 1800 // 1800 = 3 minutes in the station
#define shuttle_time_to_arrive 6000 // 6000 = 10 minutes to arrive
//stuff you should probably leave well alone!
//ATMOS
#define CELL_VOLUME 2500 //liters in a cell
#define BREATH_VOLUME 0.5 //liters in a normal breath
#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile
#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences
#define NORMPIPERATE 30 //pipe-insulation rate divisor
#define HEATPIPERATE 8 //heat-exch pipe insulation
#define FLOWFRAC 0.99 //fraction of gas transfered per process
#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //Tank starts leaking
#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere
#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion
#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold
#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 //Minimum ratio of air that must move to/from a tile to suspend group processing
#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended
#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active
#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously)
#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012
#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended
#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal
#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10
#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200
#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4
#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0
#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0
#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat
#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4
#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now
//Must be between 0 and 1. Values closer to 1 equalize temperature faster
//Should not exceed 0.4 else strange heat flow occur
#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C
#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
#define FIRE_GROWTH_RATE 40000 //For small fires
#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage
#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage
//Plasma fire properties
#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
#define PLASMA_UPPER_TEMPERATURE 1370+T0C
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
#define PLASMA_OXYGEN_FULLBURN 10
#define MIN_PLASMA_DAMAGE 1
#define MAX_PLASMA_DAMAGE 10
#define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible
// Pressure limits.
#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant)
#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE)
#define WARNING_LOW_PRESSURE 50 //This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE)
#define HAZARD_LOW_PRESSURE 20 //This is when the black ultra-low pressure icon is displayed. (This one is set as a constant)
#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount.
#define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
#define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50.
#define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
#define BODYTEMP_HEAT_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
#define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area.
#define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area.
#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat.
#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness.
#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0.
#define SPACE_HELM_MAX_TEMP_PROTECT 1500 //Thermal insulation works both ways /Malkevin
#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0.
#define SPACE_SUIT_MAX_TEMP_PROTECT 1500
#define FIRE_SUIT_MIN_TEMP_PROTECT 60 //Cold protection for firesuits
#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 //what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0.
#define FIRE_HELM_MIN_TEMP_PROTECT 60 //Cold protection for fire helmets
#define FIRE_HELM_MAX_TEMP_PROTECT 30000 //for fire helmet quality items (red and white hardhats)
#define HELMET_MIN_TEMP_PROTECT 160 //For normal helmets
#define HELMET_MAX_TEMP_PROTECT 600 //For normal helmets
#define ARMOR_MIN_TEMP_PROTECT 160 //For armor
#define ARMOR_MAX_TEMP_PROTECT 600 //For armor
#define GLOVES_MIN_TEMP_PROTECT 2.0 //For some gloves (black and)
#define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves
#define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves
#define SHOES_MAX_TEMP_PROTECT 1500 //For gloves
#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :(
#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure.
#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure.
#define AI_VOX 1 // Comment out if you don't want VOX to be enabled and have players download the voice sounds.
//Additional code for the above flags.
@@ -164,4 +52,11 @@ var/list/del_counter = list()
#ifdef TESTING
#warn compiling in TESTING mode. testing() debug messages will be visible.
#endif
#endif
//SYSTEM TOGGLES - these allow you to compile the game without some of the laggier systems if your server cannot cope with demand
/* Not yet coded
#define USE_DYNAMIC_GRAVITY //Enables the dynamic gravity system
#define USE_DYNAMIC_LIGHTING //Enables the dynamic lighting system
#define USE_DYNAMIC_ATMOS //Enables the dynamic atmos system
*/
+44
View File
@@ -0,0 +1,44 @@
var/datum/configuration/config = null
var/host = null
var/join_motd = null
var/station_name = null
var/game_version = "/tg/ Station 13"
var/changelog_hash = ""
var/ooc_allowed = 1 // used with admin verbs to disable ooc - not a config option apparently
var/dooc_allowed = 1
var/abandon_allowed = 1
var/enter_allowed = 1
var/guests_allowed = 1
var/shuttle_frozen = 0
var/shuttle_left = 0
var/tinted_weldhelh = 1
// Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked.
// Debug2 is used in conjunction with a lot of admin verbs and therefore is actually legit.
var/Debug = 0 // global debug switch
var/Debug2 = 0
//This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage
var/MAX_EX_DEVESTATION_RANGE = 3
var/MAX_EX_HEAVY_RANGE = 7
var/MAX_EX_LIGHT_RANGE = 14
var/MAX_EX_FLASH_RANGE = 14
var/MAX_EX_FLAME_RANGE = 14
var/list/be_special_flags = list(
"Traitor" = BE_TRAITOR,
"Operative" = BE_OPERATIVE,
"Changeling" = BE_CHANGELING,
"Wizard" = BE_WIZARD,
"Malf AI" = BE_MALF,
"Revolutionary" = BE_REV,
"Alien Lifeform" = BE_ALIEN,
"pAI" = BE_PAI,
"Cultist" = BE_CULTIST,
"Monkey" = BE_MONKEY,
"Ninja" = BE_NINJA
)
+11
View File
@@ -0,0 +1,11 @@
// MySQL configuration
var/sqladdress = "localhost"
var/sqlport = "3306"
var/sqlfdbkdb = "test"
var/sqlfdbklogin = "root"
var/sqlfdbkpass = ""
//Database connections
//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
var/DBConnection/dbcon = new() //Feedback database (New database)
+6
View File
@@ -0,0 +1,6 @@
var/going = 1.0 // ticker pregame countdown
var/master_mode = "traitor"//"extended"
var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode
var/wavesecret = 0 // meteor mode, delays wave progression, terrible name
var/datum/station_state/start_state = null // Used in blob mode
+25
View File
@@ -0,0 +1,25 @@
//////////////
var/NEARSIGHTEDBLOCK = 0
var/EPILEPSYBLOCK = 0
var/COUGHBLOCK = 0
var/TOURETTESBLOCK = 0
var/NERVOUSBLOCK = 0
var/BLINDBLOCK = 0
var/DEAFBLOCK = 0
var/HULKBLOCK = 0
var/TELEBLOCK = 0
var/FIREBLOCK = 0
var/XRAYBLOCK = 0
var/CLUMSYBLOCK = 0
var/STRANGEBLOCK = 0
var/RACEBLOCK = 0
var/list/bad_se_blocks
var/list/good_se_blocks
var/list/op_se_blocks
var/NULLED_SE
var/NULLED_UI
var/list/global_mutations = list() // list of hidden mutation things
+32
View File
@@ -0,0 +1,32 @@
//Preferences stuff
//Hairstyles
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
var/global/list/hair_styles_male_list = list() //stores only hair names
var/global/list/hair_styles_female_list = list() //stores only hair names
var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
var/global/list/facial_hair_styles_male_list = list() //stores only hair names
var/global/list/facial_hair_styles_female_list = list() //stores only hair names
//Underwear
var/global/list/underwear_all = list() //stores /datum/sprite_accessory/underwear indexed by name
var/global/list/underwear_m = list() //stores only underwear name
var/global/list/underwear_f = list() //stores only underwear name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//Female Uniforms
var/global/list/female_uniform_icons = list()
//radical shit
var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
var/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg','sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to
// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages
// tagged for the Cargo Bay.
var/list/TAGGERLOCATIONS = list("Disposals",
"Cargo Bay", "QM Office", "Engineering", "CE Office",
"Atmospherics", "Security", "HoS Office", "Medbay",
"CMO Office", "Chemistry", "Research", "RD Office",
"Robotics", "HoP Office", "Library", "Chapel", "Theatre",
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")
+43
View File
@@ -0,0 +1,43 @@
var/list/cardinal = list( NORTH, SOUTH, EAST, WEST )
var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
//(Exceptions: extended, sandbox and nuke) -Errorage
//Was list("3" = 30, "4" = 70).
//Spacing should be a reliable method of getting rid of a body -- Urist.
//Go away Urist, I'm restoring this to the longer list. ~Errorage
var/list/accessable_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60)
var/global/list/global_map = null
//list/global_map = list(list(1,5),list(4,3))//an array of map Z levels.
//Resulting sector map looks like
//|_1_|_4_|
//|_5_|_3_|
//
//1 - SS13
//4 - Derelict
//3 - AI satellite
//5 - empty space
var/list/landmarks_list = list() //list of all landmarks created
var/list/monkeystart = list()
var/list/wizardstart = list()
var/list/newplayer_start = list()
var/list/latejoin = list()
var/list/prisonwarp = list() //prisoners go to these
var/list/holdingfacility = list() //captured people go here
var/list/xeno_spawn = list()//Aliens spawn at these.
var/list/tdome1 = list()
var/list/tdome2 = list()
var/list/tdomeobserve = list()
var/list/tdomeadmin = list()
var/list/prisonsecuritywarp = list() //prison security goes to these
var/list/prisonwarped = list() //list of players already warped
var/list/blobstart = list()
var/list/global_activeturfs
//away missions
var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to
+12
View File
@@ -0,0 +1,12 @@
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/joined_player_list = list() //List of all clients that have joined the game at round-start or as a latejoin.
@@ -1,16 +1,16 @@
var/list/ai_names = file2list("config/names/ai.txt")
var/list/wizard_first = file2list("config/names/wizardfirst.txt")
var/list/wizard_second = file2list("config/names/wizardsecond.txt")
var/list/ninja_titles = file2list("config/names/ninjatitle.txt")
var/list/ninja_names = file2list("config/names/ninjaname.txt")
var/list/commando_names = file2list("config/names/death_commando.txt")
var/list/first_names_male = file2list("config/names/first_male.txt")
var/list/first_names_female = file2list("config/names/first_female.txt")
var/list/last_names = file2list("config/names/last.txt")
var/list/clown_names = file2list("config/names/clown.txt")
var/list/verbs = file2list("config/names/verbs.txt")
var/list/adjectives = file2list("config/names/adjectives.txt")
//loaded on startup because of "
var/list/ai_names = file2list("config/names/ai.txt")
var/list/wizard_first = file2list("config/names/wizardfirst.txt")
var/list/wizard_second = file2list("config/names/wizardsecond.txt")
var/list/ninja_titles = file2list("config/names/ninjatitle.txt")
var/list/ninja_names = file2list("config/names/ninjaname.txt")
var/list/commando_names = file2list("config/names/death_commando.txt")
var/list/first_names_male = file2list("config/names/first_male.txt")
var/list/first_names_female = file2list("config/names/first_female.txt")
var/list/last_names = file2list("config/names/last.txt")
var/list/clown_names = file2list("config/names/clown.txt")
var/list/verbs = file2list("config/names/verbs.txt")
var/list/adjectives = file2list("config/names/adjectives.txt")
//loaded on startup because of "
//would include in rsc if ' was used
+13
View File
@@ -0,0 +1,13 @@
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/portals = list() //for use by portals
var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none.
//items that ask to be called every cycle
var/global/list/machines = list()
var/global/list/processing_objects = list()
var/global/list/active_diseases = list()
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/surgeries_list = list() //list of all surgeries by name, associated with their path.
+13
View File
@@ -0,0 +1,13 @@
var/diary = null
var/diaryofmeanpeople = null
var/href_logfile = null
var/list/bombers = list( )
var/list/admin_log = list ( )
var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
var/list/combatlog = list()
var/list/IClog = list()
var/list/OOClog = list()
var/list/adminlog = list()
+12
View File
@@ -0,0 +1,12 @@
var/global/obj/effect/overlay/plmaster = null // atmospheric overlay for plasma
var/global/obj/effect/overlay/slmaster = null // atmospheric overlay for sleeping gas
// nanomanager, the manager for Nano UIs
var/datum/nanomanager/nanomanager = new()
// For FTP requests. (i.e. downloading runtime logs.)
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
var/fileaccess_timer = 0
+13
View File
@@ -0,0 +1,13 @@
var/global/obj/effect/datacore/data_core = null
var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
var/datum/sun/sun = null
var/list/powernets = list()
// this is not strictly unused although the whole modules datum thing is unused
// To remove this you need to remove that
var/datum/moduletypes/mods = new()
var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New()
+37
View File
@@ -0,0 +1,37 @@
var/dna_ident = 1 // unused global variable
var/shuttle_z = 2 //unused, was written to by a shuttle landmark
var/list/reg_dna = list( ) // unused, was written to when making unique DNA
/////////////// old events system global variables
var/eventchance = 3 //% per 5 mins
var/event = 0
var/hadevent = 0
var/blobevent = 0
///////////////
var/skipupdate = 0
var/list/jobMax = list()
var/forceblob = 0
var/shuttlecoming = 0
var/datum/debug/debugobj
var/list/liftable_structures = list(
/obj/machinery/autolathe,
/obj/machinery/constructable_frame,
/obj/machinery/hydroponics,
/obj/machinery/computer,
/obj/structure/optable,
/obj/structure/dispenser,
/obj/machinery/gibber,
/obj/machinery/microwave,
/obj/machinery/vending,
/obj/machinery/seed_extractor,
/obj/machinery/space_heater,
/obj/machinery/recharge_station,
/obj/machinery/flasher,
/obj/structure/stool,
/obj/structure/closet,
/obj/machinery/photocopier,
/obj/structure/filingcabinet,
/obj/structure/reagent_dispensers,
/obj/machinery/portable_atmospherics/canister
)
+12 -4
View File
@@ -45,7 +45,7 @@
if(modifiers["ctrl"])
CtrlClickOn(A)
return
if(control_disabled || stat || world.time <= next_move) return
next_move = world.time + 9
@@ -113,11 +113,12 @@
else
Topic("aiDisable=4", list("aiDisable"="4"), 1)
/obj/machinery/power/apc/AICtrlClick() // turns off APCs.
Topic("breaker=1", list("breaker"="1"), 0) // 0 meaning no window (consistency! wait...)
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
toggle_breaker()
/atom/proc/AIAltClick()
/atom/proc/AIAltClick(var/mob/living/silicon/ai/user)
AltClick(user)
return
/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors.
@@ -128,3 +129,10 @@
// disable/6 is not in Topic; disable/5 disables both temporary and permenant shock
Topic("aiDisable=5", list("aiDisable"="5"), 1)
return
//
// Override TurfAdjacent for AltClicking
//
/mob/living/silicon/ai/TurfAdjacent(var/turf/T)
return (cameranet && cameranet.checkTurfVis(T))
+17 -7
View File
@@ -55,7 +55,7 @@
if(modifiers["ctrl"])
CtrlClickOn(A)
return
if(stat || paralysis || stunned || weakened)
return
@@ -65,6 +65,8 @@
return
if(istype(loc,/obj/mecha))
if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled
return
var/obj/mecha/M = loc
return M.click_action(A,src)
@@ -243,7 +245,7 @@
/atom/proc/AltClick(var/mob/user)
var/turf/T = get_turf(src)
if(T && T.Adjacent(user))
if(T && user.TurfAdjacent(T))
if(user.listed_turf == T)
user.listed_turf = null
else
@@ -251,6 +253,9 @@
user.client.statpanel = T.name
return
/mob/proc/TurfAdjacent(var/turf/T)
return T.Adjacent(src)
/*
Misc helpers
@@ -292,11 +297,16 @@
if( buckled || !A || !x || !y || !A.x || !A.y ) return
var/dx = A.x - x
var/dy = A.y - y
if(!dx && !dy) return
if(!dx && !dy) // Wall items are graphically shifted but on the floor
if(A.pixel_y > 16) dir = NORTH
else if(A.pixel_y < -16)dir = SOUTH
else if(A.pixel_x > 16) dir = EAST
else if(A.pixel_x < -16)dir = WEST
return
if(abs(dx) < abs(dy))
if(dy > 0) usr.dir = NORTH
else usr.dir = SOUTH
if(dy > 0) dir = NORTH
else dir = SOUTH
else
if(dx > 0) usr.dir = EAST
else usr.dir = WEST
if(dx > 0) dir = EAST
else dir = WEST
+2 -1
View File
@@ -23,7 +23,8 @@
//Lower left, persistant menu
#define ui_inventory "1:6,1:5"
//changeling chem indicator
//Middle left indicators
#define ui_alienplasmadisplay "14:28,8:13"
#define ui_lingchemdisplay "1,7:15"
//Lower center, persistant menu
+7 -1
View File
@@ -141,6 +141,12 @@
mymob.healths.name = "health"
mymob.healths.screen_loc = ui_alien_health
alien_plasma_display = new /obj/screen()
alien_plasma_display.icon = 'icons/mob/screen_gen.dmi'
alien_plasma_display.icon_state = "power_display2"
alien_plasma_display.name = "plasma stored"
alien_plasma_display.screen_loc = ui_alienplasmadisplay
mymob.blind = new /obj/screen()
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
@@ -161,6 +167,6 @@
mymob.client.screen = null
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += adding + other
+57 -38
View File
@@ -91,6 +91,7 @@ var/datum/global_hud/global_hud = new()
var/obj/screen/lingchemdisplay
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/alien_plasma_display
var/obj/screen/r_hand_hud_object
var/obj/screen/l_hand_hud_object
var/obj/screen/action_intent
@@ -186,52 +187,70 @@ datum/hud/New(mob/owner)
else if(isovermind(mymob))
blob_hud()
if(istype(mymob.loc,/obj/mecha))
hide_hud()
/datum/hud/proc/hide_hud() // hide hands is not currently used by anything but could be
if(!ismob(mymob))
return 0
if(!mymob.client)
return 0
if(hud_shown)
hud_shown = 0
if(adding)
mymob.client.screen -= adding
if(other)
mymob.client.screen -= other
if(hotkeybuttons)
mymob.client.screen -= hotkeybuttons
if(item_action_list)
mymob.client.screen -= item_action_list
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
mymob.client.screen += l_hand_hud_object //we want the hands to be visible
mymob.client.screen += r_hand_hud_object //we want the hands to be visible
mymob.client.screen += action_intent //we want the intent swticher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
/datum/hud/proc/show_hud()
if(!ismob(mymob))
return 0
if(!mymob.client)
return 0
if(!hud_shown)
hud_shown = 1
if(adding)
mymob.client.screen += adding
if(other && inventory_shown)
mymob.client.screen += other
if(hotkeybuttons && !hotkey_ui_hidden)
mymob.client.screen += hotkeybuttons
action_intent.screen_loc = ui_acti //Restore intent selection to the original position
mymob.client.screen += mymob.zone_sel //This one is a special snowflake
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
set name = "F12"
set hidden = 1
if(hud_used)
if(hud_used && client)
if(ishuman(src))
if(!src.client) return
if(hud_used.hud_shown)
hud_used.hud_shown = 0
if(src.hud_used.adding)
src.client.screen -= src.hud_used.adding
if(src.hud_used.other)
src.client.screen -= src.hud_used.other
if(src.hud_used.hotkeybuttons)
src.client.screen -= src.hud_used.hotkeybuttons
if(src.hud_used.item_action_list)
src.client.screen -= src.hud_used.item_action_list
//Due to some poor coding some things need special treatment:
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible
src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible
src.client.screen += src.hud_used.action_intent //we want the intent swticher visible
src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason.
hud_used.hide_hud()
else
hud_used.hud_shown = 1
if(src.hud_used.adding)
src.client.screen += src.hud_used.adding
if(src.hud_used.other && src.hud_used.inventory_shown)
src.client.screen += src.hud_used.other
if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden)
src.client.screen += src.hud_used.hotkeybuttons
src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position
src.client.screen += src.zone_sel //This one is a special snowflake
hud_used.hidden_inventory_update()
hud_used.persistant_inventory_update()
update_action_buttons()
hud_used.show_hud()
else
usr << "\red Inventory hiding is currently only supported for human mobs, sorry."
else
+7 -1
View File
@@ -46,7 +46,7 @@
return 1
if(usr.next_move >= world.time)
return
usr.next_move = world.time + 10
usr.next_move = world.time + 6
if(usr.stat || usr.restrained() || usr.stunned || usr.lying)
return 1
@@ -85,6 +85,8 @@
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(master)
var/obj/item/I = usr.get_active_hand()
if(I)
@@ -171,6 +173,8 @@
usr.hud_used.hidden_inventory_update()
if("equip")
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.quick_equip()
@@ -314,6 +318,8 @@
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
switch(name)
if("r_hand")
if(iscarbon(usr))
+15
View File
@@ -31,6 +31,21 @@
if(client.buildmode)
build_click(src, client.buildmode, params, A)
return
var/list/modifiers = params2list(params)
if(modifiers["middle"])
MiddleClickOn(A)
return
if(modifiers["shift"])
ShiftClickOn(A)
return
if(modifiers["alt"])
AltClickOn(A)
return
if(modifiers["ctrl"])
CtrlClickOn(A)
return
if(world.time <= next_move) return
next_move = world.time + 8
// You are responsible for checking config.ghost_interaction when you override this function
+17
View File
@@ -0,0 +1,17 @@
// Blob Overmind Controls
/mob/camera/blob/CtrlClickOn(var/atom/A) // Expand blob
var/turf/T = get_turf(A)
if(T)
expand_blob(T)
/mob/camera/blob/MiddleClickOn(var/atom/A) // Rally spores
var/turf/T = get_turf(A)
if(T)
rally_spores(T)
/mob/camera/blob/AltClickOn(var/atom/A) // Create a shield
var/turf/T = get_turf(A)
if(T)
create_shield(T)
+56 -28
View File
@@ -80,15 +80,24 @@ datum/light_source
proc/add_effect()
// only do this if the light is turned on and is on the map
if(owner.loc && owner.luminosity > 0)
effect = new_effect() // identify the effects of this light source
for(var/turf/T in effect)
T.update_lumcount(effect[T]) // apply the effect
// effect = new_effect() // identify the effects of this light source
// for(var/turf/T in effect)
// T.update_lumcount(effect[T]) // apply the effect
// why was this looping through all the turfs twice
effect = list()
for(var/turf/T in view(owner.get_light_range(),owner))
var/delta_lumen = lum(T)
if(delta_lumen > 0)
effect[T] = delta_lumen
T.update_lumcount(delta_lumen)
return 0
else
owner.light = null
return 1 //cause the light to be removed from the lights list and garbage collected once it's no
//longer referenced by the queue
/*
proc/new_effect()
. = list()
var/range = owner.get_light_range()
@@ -97,6 +106,7 @@ datum/light_source
if(change_in_lumcount > 0)
.[T] = change_in_lumcount
return .
*/
proc/lum(turf/A)
@@ -193,46 +203,63 @@ turf/proc/update_lumcount(amount)
lighting_controller.changed_turfs += src
lighting_changed = 1
turf/proc/lighting_tag(var/level)
var/area/A = loc
return A.tagbase + "sd_L[level]"
turf/proc/build_lighting_area(var/tag, var/level)
var/area/Area = loc
var/area/A = new Area.type() // create area if it wasn't found
// replicate vars
for(var/V in Area.vars)
switch(V)
if("contents","lighting_overlay","overlays") continue
else
if(issaved(Area.vars[V])) A.vars[V] = Area.vars[V]
A.tag = tag
A.lighting_subarea = 1
A.lighting_space = 0 // in case it was copied from a space subarea
A.SetLightLevel(level)
Area.related += A
return A
turf/proc/shift_to_subarea()
lighting_changed = 0
var/area/Area = loc
if(!istype(Area) || !Area.lighting_use_dynamic) return
// change the turf's area depending on its brightness
// restrict light to valid levels
var/light = min(max(round(lighting_lumcount,1),0),lighting_controller.lighting_states)
var/find = findtextEx(Area.tag, "sd_L")
var/new_tag = copytext(Area.tag, 1, find)
new_tag += "sd_L[light]"
var/level = min(max(round(lighting_lumcount,1),0),lighting_controller.lighting_states)
var/new_tag = lighting_tag(level)
if(Area.tag!=new_tag) //skip if already in this area
var/area/A = locate(new_tag) // find an appropriate area
if(!A)
A = new Area.type() // create area if it wasn't found
// replicate vars
for(var/V in Area.vars)
switch(V)
if("contents","lighting_overlay","overlays") continue
else
if(issaved(Area.vars[V])) A.vars[V] = Area.vars[V]
A.tag = new_tag
A.lighting_subarea = 1
A.SetLightLevel(light)
Area.related += A
A = build_lighting_area(new_tag,level)
A.contents += src // move the turf into the area
// Dedicated lighting sublevel for space turfs
// helps us depower things in space, remove space fire alarms,
// and evens out space lighting
turf/space/lighting_tag(var/level)
var/area/A = loc
return A.tagbase + "sd_L_space"
turf/space/build_lighting_area(var/tag,var/level)
var/area/A = ..(tag,4)
A.lighting_space = 1
A.SetLightLevel(4)
A.icon_state = null
return A
area
var/lighting_use_dynamic = 1 //Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area
var/image/lighting_overlay //tracks the darkness image of the area for easy removal
var/lighting_subarea = 0 //tracks whether we're a lighting sub-area
var/lighting_space = 0 // true for space-only lighting subareas
var/tagbase
proc/SetLightLevel(light)
if(!src) return
@@ -259,7 +286,8 @@ area
T.update_lumcount(0)
proc/InitializeLighting() //TODO: could probably improve this bit ~Carn
if(!tag) tag = "[type]"
tagbase = "[type]"
if(!tag) tag = tagbase
if(!lighting_use_dynamic)
if(!lighting_subarea) // see if this is a lighting subarea already
//show the dark overlay so areas, not yet in a lighting subarea, won't be bright as day and look silly.
+1 -1
View File
@@ -74,7 +74,7 @@
var/humans_need_surnames = 0
var/allow_random_events = 0 // enables random events mid-round when set to 1
var/allow_ai = 1 // allow ai job
var/allow_ai = 0 // allow ai job
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
var/changeling_scaling_coeff = 10 //how much does the amount of players get divided by to determine changelings
+5 -4
View File
@@ -41,6 +41,9 @@ datum/controller/game_controller/New()
createRandomZlevel() //probably shouldn't be here!
for(var/i=0, i<max_secret_rooms, i++)
make_mining_asteroid_secret()
if(!events)
new /datum/controller/event()
@@ -68,9 +71,6 @@ datum/controller/game_controller/proc/setup()
setupgenetics()
setupfactions()
for(var/i=0, i<max_secret_rooms, i++)
make_mining_asteroid_secret()
spawn(0)
if(ticker)
ticker.pregame()
@@ -129,6 +129,7 @@ datum/controller/game_controller/proc/process()
last_thing_processed = air_master.type
air_master.process()
air_cost = (world.timeofday - timer) / 10
global_activeturfs = air_master.active_turfs.len
sleep(breather_ticks)
@@ -205,7 +206,7 @@ datum/controller/game_controller/proc/process()
var/end_time = world.timeofday
if(end_time < start_time)
start_time -= 864000 //deciseconds in a day
start_time -= MIDNIGHT_ROLLOVER //deciseconds in a day
sleep( round(minimum_ticks - (end_time - start_time),1) )
else
sleep(10)
+51 -303
View File
@@ -5,16 +5,23 @@
// these define the time taken for the shuttle to get to SS13
// and the time before it leaves again
#define SHUTTLEARRIVETIME 600 // 10 minutes = 600 seconds
#define SHUTTLELEAVETIME 180 // 3 minutes = 180 seconds
#define SHUTTLETRANSITTIME 120 // 2 minutes = 120 seconds
#define SHUTTLEAUTOCALLTIMER 2.5 // 25 minutes
#define UNDOCKED 0 //Shuttle is always this until the shuttle has reached the station.
#define DOCKED -1 //Shuttle is at the station
#define TRANSIT 1 //Shuttle is coming to centcom from the station
#define ENDGAME 2 //It's what game tickers check for for the purposes of round completion, I'm not touching it.
var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
datum/shuttle_controller
var/location = 0 //0 = somewhere far away (in spess), 1 = at SS13, 2 = returned from SS13
var/location = UNDOCKED //
var/online = 0
var/direction = 1 //-1 = going back to central command, 1 = going to SS13, 2 = in transit to centcom (not recalled)
var/direction = 1 //-1 = going back to central command, 1 = going to SS13. Only important for recalling
var/endtime // timeofday that shuttle arrives
var/timelimit //important when the shuttle gets called for more than shuttlearrivetime
@@ -22,6 +29,8 @@ datum/shuttle_controller
var/fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED"
var/always_fake_recall = 0
var/pods = list("escape", "pod1", "pod2", "pod3", "pod4")
// call the shuttle
// if not called before, set the endtime to T+600 seconds
@@ -35,15 +44,16 @@ datum/shuttle_controller
settimeleft(SHUTTLEARRIVETIME*coeff)
online = 1
if(always_fake_recall)
if ((seclevel2num(get_security_level()) == SEC_LEVEL_RED))
fake_recall = rand(180,300)
fake_recall = rand(SHUTTLEARRIVETIME / 4, SHUTTLEARRIVETIME - 100 / 2)
else
fake_recall = rand(300,500)
fake_recall = rand(SHUTTLEARRIVETIME / 2, SHUTTLEARRIVETIME - 100)
proc/recall()
if(direction == 1)
var/timeleft = timeleft()
if(timeleft >= 600)
if(timeleft >= SHUTTLEARRIVETIME)
online = 0
direction = 1
endtime = null
@@ -100,12 +110,18 @@ datum/shuttle_controller
if(callshuttle)
if(!online && direction == 1) //we don't call the shuttle if it's already coming
incall(2.5) //25 minutes! If they want to recall, they have 20 minutes to do so
incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
world << sound('sound/AI/shuttlecalled.ogg')
proc/move_shuttles()
var/datum/shuttle_manager/s
for(var/t in pods)
s = shuttles[t]
s.move_shuttle()
proc/process()
emergency_shuttle
@@ -115,307 +131,39 @@ datum/shuttle_controller
var/timeleft = timeleft()
if(timeleft > 1e5) // midnight rollover protection
timeleft = 0
switch(location)
if(0)
/* --- Shuttle is in transit to Central Command from SS13 --- */
if(direction == 2)
if(timeleft>0)
return 0
/* --- Shuttle has arrived at Centrcal Command --- */
else
// turn off the star spawners
/*
for(var/obj/effect/starspawner/S in world)
S.spawning = 0
*/
location = 2
//main shuttle
var/area/start_location = locate(/area/shuttle/escape/transit)
var/area/end_location = locate(/area/shuttle/escape/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in world)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
//pods
start_location = locate(/area/shuttle/escape_pod1/transit)
end_location = locate(/area/shuttle/escape_pod1/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in world)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod2/transit)
end_location = locate(/area/shuttle/escape_pod2/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in world)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod3/transit)
end_location = locate(/area/shuttle/escape_pod3/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in world)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod5/transit)
end_location = locate(/area/shuttle/escape_pod5/centcom)
start_location.move_contents_to(end_location, null, EAST)
for(var/obj/machinery/door/D in world)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
online = 0
return 1
/* --- Shuttle has docked centcom after being recalled --- */
if(timeleft>timelimit)
if(location == UNDOCKED)
if(direction == -1)
if(timeleft >= timelimit)
online = 0
direction = 1
endtime = null
return 0
else if((fake_recall != 0) && (timeleft <= fake_recall))
recall()
fake_recall = 0
return 0
/* --- Shuttle has docked with the station - begin countdown to transit --- */
else if(timeleft <= 0)
location = 1
var/area/start_location = locate(/area/shuttle/escape/centcom)
var/area/end_location = locate(/area/shuttle/escape/station)
var/list/dstturfs = list()
var/throwy = world.maxy
for(var/turf/T in end_location)
dstturfs += T
if(T.y < throwy)
throwy = T.y
// hey you, get out of the way!
for(var/turf/T in dstturfs)
// find the turf to move things to
var/turf/D = locate(T.x, throwy - 1, 1)
//var/turf/E = get_step(D, SOUTH)
for(var/atom/movable/AM as mob|obj in T)
AM.Move(D)
// NOTE: Commenting this out to avoid recreating mass driver glitch
/*
spawn(0)
AM.throw_at(E, 1, 1)
return
*/
if(istype(T, /turf/simulated))
del(T)
for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area...
bug.gib()
start_location.move_contents_to(end_location)
settimeleft(SHUTTLELEAVETIME)
send2irc("Server", "The Emergency Shuttle has docked with the station.")
captain_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.")
world << sound('sound/AI/shuttledock.ogg')
return 1
if(1)
if(timeleft>0)
return 0
/* --- Shuttle leaves the station, enters transit --- */
else
// Turn on the star effects
/* // kinda buggy atm, i'll fix this later
for(var/obj/effect/starspawner/S in world)
if(!S.spawning)
spawn() S.startspawn()
*/
location = 0 // in deep space
direction = 2 // heading to centcom
//main shuttle
var/area/start_location = locate(/area/shuttle/escape/station)
var/area/end_location = locate(/area/shuttle/escape/transit)
settimeleft(SHUTTLETRANSITTIME)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
// Some aesthetic turbulance shaking
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
//pods
start_location = locate(/area/shuttle/escape_pod1/station)
end_location = locate(/area/shuttle/escape_pod1/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod2/station)
end_location = locate(/area/shuttle/escape_pod2/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod3/station)
end_location = locate(/area/shuttle/escape_pod3/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod5/station)
end_location = locate(/area/shuttle/escape_pod5/transit)
start_location.move_contents_to(end_location, null, EAST)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
return 1
else
return 1
else if(fake_recall && (timeleft <= fake_recall))
recall()
fake_recall = 0
return 0
else if(timeleft <= 0)
var/datum/shuttle_manager/s = shuttles["escape"]
s.move_shuttle()
location = DOCKED
settimeleft(SHUTTLELEAVETIME)
send2irc("Server", "The Emergency Shuttle has docked with the station.")
captain_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.")
world << sound('sound/AI/shuttledock.ogg')
else if(timeleft <= 0) //Nothing happens if time's not up and the ship's docked or later
if(location == DOCKED)
move_shuttles()
location = TRANSIT
settimeleft(SHUTTLETRANSITTIME)
captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
else if(location == TRANSIT)
move_shuttles()
message_admins("Shuttles have attempted to move to Centcom")
location = ENDGAME
online = 0
endtime = null
return 1
return 0
/*
Some slapped-together star effects for maximum spess immershuns. Basically consists of a
+11 -3
View File
@@ -3,6 +3,7 @@ var/global/datum/getrev/revdata = new()
/datum/getrev
var/project_href
var/revision
var/date
var/showinfo
New()
@@ -16,16 +17,23 @@ var/global/datum/getrev/revdata = new()
var/list/last_entry = text2list(head_log[line], " ")
if(last_entry.len < 2) continue
revision = last_entry[2]
// Get date/time
if(last_entry.len >= 5)
var/unix_time = text2num(last_entry[5])
if(unix_time)
date = unix2date(unix_time)
break
showinfo = "<b>Server Revision:</b> "
if(revision)
showinfo += "<a href='[project_href]/commit/[revision]'>[revision]</a>"
showinfo += "<a href='[project_href]/commit/[revision]'><BR>[(date ? date : "No Date")]<BR>[revision]</a>"
else
showinfo += "*unknown*"
showinfo += "<p>-<a href='[project_href]/issues/new'>Report Bugs Here-</a><br><i>Please provide as much info as possible<br>Copy/paste the revision hash into your issue report if possible, thanks</i> :)</p>"
showinfo += "<p>-<a href='[project_href]/issues/new'>Report Bugs Here-</a><br><i>Please provide as much info as possible<br>Copy/paste the revision date and hash into your issue report if possible, thanks</i> :)</p>"
world.log << "Running /tg/ revision number: [revision]."
world.log << "Running /tg/ revision:"
world.log << date
world.log << revision
return
client/verb/showrevinfo()
+1 -1
View File
@@ -180,6 +180,6 @@
return 0
if(destination.z > 7) //Away mission z-levels
if(destination.z == 7) //Away mission z-levels
return 0
return 1
+5 -1
View File
@@ -47,6 +47,8 @@ datum/mind
var/has_been_rev = 0//Tracks if this mind has been a rev or not
var/list/cult_words = list()
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
@@ -73,6 +75,8 @@ datum/mind
if(new_character.mind) //disassociate any mind currently in our new body's mind variable
new_character.mind.current = null
nanomanager.user_transferred(current, new_character)
current = new_character //associate ourself with our new body
new_character.mind = src //and associate our new body with ourself
@@ -1184,7 +1188,7 @@ datum/mind
mind.special_role = ""
//BLOB
/mob/camera/overmind/mind_initialize()
/mob/camera/blob/mind_initialize()
..()
mind.special_role = "Blob"
+1 -1
View File
@@ -16,4 +16,4 @@
/datum/debug
var/list/debuglist
var/list/debuglist
+1 -1
View File
@@ -64,7 +64,7 @@
break
var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - usr
if(L)
if(L && L.stat != DEAD)
projectile.cast(L.loc)
break
+11 -3
View File
@@ -28,17 +28,18 @@
animation.icon_state = "liquify"
animation.layer = 5
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
target.buckled.unbuckle()
if(phaseshift == 1)
animation.dir = target.dir
flick("phase_shift",animation)
target.loc = holder
target.client.eye = holder
sleep(jaunt_duration)
mobloc = get_turf(target.loc)
animation.loc = mobloc
target.canmove = 0
holder.reappearing = 1
sleep(20)
animation.dir = target.dir
flick("phase_shift2",animation)
@@ -56,7 +57,6 @@
else
flick("liquify",animation)
target.loc = holder
target.client.eye = holder
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
steam.set_up(10, 0, mobloc)
steam.start()
@@ -66,6 +66,7 @@
steam.location = mobloc
steam.start()
target.canmove = 0
holder.reappearing = 1
sleep(20)
flick("reappear",animation)
sleep(5)
@@ -85,11 +86,18 @@
icon = 'icons/effects/effects.dmi'
icon_state = "nothing"
var/canmove = 1
var/reappearing = 0
density = 0
anchored = 1
/obj/effect/dummy/spell_jaunt/Del()
// Eject contents if deleted somehow
for(var/atom/movable/AM in src)
AM.loc = get_turf(src)
..()
/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction)
if (!src.canmove) return
if (!src.canmove || reappearing) return
var/turf/newLoc = get_step(src,direction)
if(!(newLoc.flags & NOJAUNT))
loc = newLoc
+1 -1
View File
@@ -245,7 +245,7 @@
proj_step_delay = 1
/obj/effect/proc_holder/spell/turf/fireball/cast(var/turf/T)
explosion(T, -1, 0, 2, 3, 0)
explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball
+24 -7
View File
@@ -247,9 +247,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/armory/ballistic
name = "Combat Shotguns crate"
contains = list(/obj/item/weapon/gun/projectile/shotgun/pump/combat,
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
/obj/item/weapon/gun/projectile/shotgun/pump/combat)
contains = list(/obj/item/weapon/gun/projectile/shotgun/combat,
/obj/item/weapon/gun/projectile/shotgun/combat,
/obj/item/weapon/gun/projectile/shotgun/combat)
cost = 20
containername = "combat shotgun crate"
@@ -302,7 +302,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "exile implant crate"
/datum/supply_packs/security/securitybarriers
name = "Security Barriers"
name = "Security barriers"
contains = list(/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
@@ -310,6 +310,23 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 20
containername = "security barriers crate"
/datum/supply_packs/security/securityclothes
name = "Security clothing crate"
contains = list(/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/suit/security/officer,
/obj/item/clothing/suit/security/officer,
/obj/item/clothing/head/beret/sec/navyofficer,
/obj/item/clothing/head/beret/sec/navyofficer,
/obj/item/clothing/under/rank/warden/navyblue,
/obj/item/clothing/suit/security/warden,
/obj/item/clothing/head/beret/sec/navywarden,
/obj/item/clothing/under/rank/head_of_security/navyblue,
/obj/item/clothing/suit/security/hos,
/obj/item/clothing/head/beret/sec/navyhos)
cost = 30
containername = "security clothing crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Engineering /////////////////////////////////////
@@ -411,8 +428,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/engineering/engine/field_gen
name = "Field Generator crate"
contains = list(/obj/machinery/field_generator,
/obj/machinery/field_generator)
contains = list(/obj/machinery/field/generator,
/obj/machinery/field/generator)
cost = 10
containername = "field generator crate"
@@ -857,7 +874,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "janitorial supplies"
/datum/supply_packs/misc/janitor/janicart
name = "Janitorial Cart & Galoshes crate"
name = "Janitorial Cart and Galoshes crate"
contains = list(/obj/structure/janitorialcart,
/obj/item/clothing/shoes/galoshes)
cost = 10
+142 -19
View File
@@ -13,7 +13,9 @@ var/list/uplink_items = list()
var/datum/uplink_item/I = new item()
if(!I.item)
continue
if(I.gamemodes.len && ticker && !(ticker.mode.name in I.gamemodes))
if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes))
continue
if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom))
continue
if(I.last)
last += I
@@ -44,6 +46,7 @@ var/list/uplink_items = list()
var/cost = 0
var/last = 0 // Appear last
var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here.
var/list/excludefrom = list()//Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something.
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U)
if(item)
@@ -94,24 +97,41 @@ var/list/uplink_items = list()
/datum/uplink_item/dangerous/revolver
name = "Full Revolver"
desc = "The syndicate revolver is a traditional handgun that fires .357 Magnum cartridges and has 7 chambers."
item = /obj/item/weapon/gun/projectile
item = /obj/item/weapon/gun/projectile/revolver
cost = 6
/datum/uplink_item/dangerous/ammo
name = "Ammo-357"
desc = "A box that contains seven additional rounds for the revolver, made using an automatic lathe."
item = /obj/item/ammo_magazine/a357
cost = 2
/datum/uplink_item/dangerous/smg
name = "C-20r Submachine Gun"
desc = "A fully-loaded Scarborough Arms-developed submachine gun that fires 12mm automatic rounds with a 20-round magazine."
item = /obj/item/weapon/gun/projectile/automatic/c20r
cost = 8
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/machinegun
name = "L6 Squad Automatic Weapon"
desc = "A traditionally constructed machine gun made by AA-2531. This deadly weapon has a massive 50-round magazine of 7.62×51mm ammunition."
item = /obj/item/weapon/gun/projectile/automatic/l6_saw
cost = 20
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/crossbow
name = "Miniature Energy Crossbow"
desc = "A short bow mounted across a tiller in miniature. Small enough to fit into a pocket or slip into a bag unnoticed. It fires bolts tipped with toxin, a poison collected from an organism. Its bolts stun enemies for short periods, and replenish automatically."
desc = "A short bow mounted across a tiller in miniature. Small enough to fit into a pocket or slip into a bag unnoticed. It fires bolts tipped with toxin, a poison collected from an organism. \
Its bolts stun enemies for short periods, and replenish automatically."
item = /obj/item/weapon/gun/energy/crossbow
cost = 5
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/flamethrower
name = "Flamethrower"
desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution."
item = /obj/item/weapon/flamethrower/full/tank
cost = 6
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
desc = "The esword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise."
desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise."
item = /obj/item/weapon/melee/energy/sword
cost = 4
@@ -127,6 +147,70 @@ var/list/uplink_items = list()
item = /obj/item/weapon/grenade/syndieminibomb
cost = 3
/datum/uplink_item/dangerous/viscerators
name = "Viscerator Delivery Grenade"
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
item = /obj/item/weapon/grenade/spawnergrenade/manhacks
cost = 4
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/bioterror
name = "Biohazardous Chemical Sprayer"
desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \
Use with extreme caution, to prevent exposure to yourself and your fellow operatives."
item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror
cost = 15
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/gygax
name = "Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \
This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it."
item = /obj/mecha/combat/gygax/dark/loaded
cost = 45
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/mauler
name = "Mauler Exosuit"
desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targetting, thrust vectoring, and deployable smoke."
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 70
gamemodes = list(/datum/game_mode/nuclear)
// AMMUNITION
/datum/uplink_item/ammo
category = "Ammunition"
/datum/uplink_item/ammo/revolver
name = "Ammo-357"
desc = "A box that contains seven additional rounds for the revolver, made using an automatic lathe."
item = /obj/item/ammo_box/a357
cost = 2
/datum/uplink_item/ammo/smg
name = "Ammo-12mm"
desc = "A 20-round 12mm magazine for use in the C-20r submachine gun."
item = /obj/item/ammo_box/magazine/m12mm
cost = 1
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/pistol
name = "Ammo-10mm"
desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol."
item = /obj/item/ammo_box/magazine/m10mm
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/machinegun
name = "Ammo-7.62×51mm"
desc = "A 50-round magazine of 7.62×51mm ammunition for use in the L6 SAW machinegun. By the time you need to use this, you'll already be on a pile of corpses."
item = /obj/item/ammo_box/magazine/m762
cost = 6
gamemodes = list(/datum/game_mode/nuclear)
// STEALTHY WEAPONS
/datum/uplink_item/stealthy_weapons
@@ -134,9 +218,11 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons/para_pen
name = "Paralysis Pen"
desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target immobile on injection and makes them seem dead to observers. Side effects of the drug include noticeable drooling. The pen holds one dose of paralyzing agent, and cannot be refilled."
desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target immobile on injection and makes them seem dead to observers. \
Side effects of the drug include noticeable drooling. The pen holds one dose of paralyzing agent, and cannot be refilled."
item = /obj/item/weapon/pen/paralysis
cost = 3
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
@@ -146,10 +232,17 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons/detomatix
name = "Detomatix PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA."
desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. \
The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA."
item = /obj/item/weapon/cartridge/syndicate
cost = 3
/datum/uplink_item/stealthy_weapons/silencer
name = "Stetchkin Silencer"
desc = "Fitted for use on the Stetchkin pistol, this silencer will make its shots quieter when equipped onto it."
item = /obj/item/weapon/silencer
cost = 3
gamemodes = list(/datum/game_mode/nuclear)
// STEALTHY TOOLS
@@ -164,7 +257,8 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_tools/chameleon_stamp
name = "Chameleon Stamp"
desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp™. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; it can also be used in a washing machine to forge clothing."
desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp™. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \
it can also be used in a washing machine to forge clothing."
item = /obj/item/weapon/stamp/chameleon
cost = 1
@@ -215,6 +309,14 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/toolbox/syndicate
cost = 1
/datum/uplink_item/device_tools/medkit
name = "Syndicate Medical Supply Kit"
desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical hud for quick identification of injured comrades, \
and other medical supplies helpful for a medical field operative.."
item = /obj/item/weapon/storage/firstaid/tactical
cost = 5
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/space_suit
name = "Syndicate Space Suit"
desc = "The red syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
@@ -223,7 +325,9 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
desc = "These glasses are thermals disguised as engineers' optical meson scanners. \
They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. \
Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
item = /obj/item/clothing/glasses/thermal/syndi
cost = 3
@@ -247,25 +351,30 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/plastic_explosives
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, attach it to organisms to destroy them, or connect a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, attach it to organisms to destroy them, or connect a signaler to its wiring to make it remotely detonable. \
It has a modifiable timer with a minimum setting of 10 seconds."
item = /obj/item/weapon/plastique
cost = 2
/datum/uplink_item/device_tools/powersink
name = "Power sink"
desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. Ordering this sends you a small beacon that will teleport the power sink to your location on activation."
desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. \
Ordering this sends you a small beacon that will teleport the power sink to your location on activation."
item = /obj/item/device/powersink
cost = 5
/datum/uplink_item/device_tools/singularity_beacon
name = "Singularity Beacon"
desc = "When screwed to wiring attached to an electric grid, then activated, this large device pulls the singularity towards it. Does not work when the singularity is still in containment. A singularity beacon can cause catastrophic damage to a space station, leading to an emergency evacuation. Because of its size, it cannot be carried. Ordering this sends you a small beacon that will teleport the larger beacon to your location on activation."
desc = "When screwed to wiring attached to an electric grid, then activated, this large device pulls the singularity towards it. \
Does not work when the singularity is still in containment. A singularity beacon can cause catastrophic damage to a space station, \
leading to an emergency evacuation. Because of its size, it cannot be carried. Ordering this sends you a small beacon that will teleport the larger beacon to your location on activation."
item = /obj/item/device/sbeacondrop
cost = 7
/datum/uplink_item/device_tools/syndicate_bomb
name = "Syndicate Bomb"
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 30 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. You can wrench the bomb down to prevent removal. The crew may defuse the bomb."
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 30 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may defuse the bomb."
item = /obj/item/device/sbeacondrop/bomb
cost = 5
@@ -274,7 +383,14 @@ var/list/uplink_items = list()
desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur."
item = /obj/item/weapon/circuitboard/teleporter
cost = 20
gamemodes = list("nuclear emergency")
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/shield
name = "Energy Shield"
desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending against other attacks."
item = /obj/item/weapon/shield/energy
cost = 8
gamemodes = list(/datum/game_mode/nuclear)
// IMPLANTS
@@ -290,10 +406,16 @@ var/list/uplink_items = list()
/datum/uplink_item/implants/uplink
name = "Uplink Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. The ability for an agent to open an uplink after their posessions have been stripped from them makes this implant excellent for escaping confinement."
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. \
The ability for an agent to open an uplink after their posessions have been stripped from them makes this implant excellent for escaping confinement."
item = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
cost = 10
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to inject a chemical cocktail, which has a mild healing effect along with removing all stuns and increasing his speed."
item = /obj/item/weapon/storage/box/syndie_kit/imp_adrenal
cost = 4
// POINTLESS BADASSERY
@@ -305,6 +427,7 @@ var/list/uplink_items = list()
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 10 telecrystals, but you do not know which specialisation you will receive."
item = /obj/item/weapon/storage/box/syndicate
cost = 10
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/badass/balloon
name = "For showing that you are The Boss"
+1 -1
View File
@@ -207,7 +207,7 @@
icon_state = "beartrap[armed]"
user << "<span class='notice'>[src] is now [armed ? "armed" : "disarmed"]</span>"
/obj/item/weapon/legcuffs/beartrap/HasEntered(AM as mob|obj)
/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj)
if(armed)
if(ishuman(AM))
if(isturf(src.loc))
+57 -16
View File
@@ -127,115 +127,141 @@ proc/process_ghost_teleport_locs()
luminosity = 1
lighting_use_dynamic = 0
var/push_dir = SOUTH
var/destination
/area/shuttle/arrival
name = "\improper Arrival Shuttle"
/area/shuttle/arrival/pre_game
icon_state = "shuttle2"
destination = /area/shuttle/arrival/station
/area/shuttle/arrival/station
icon_state = "shuttle"
destination = /area/shuttle/arrival/pre_game
/area/shuttle/escape
name = "\improper Emergency Shuttle"
music = "music/escape.ogg"
/area/shuttle/escape/station
name = "\improper Emergency Shuttle Station"
icon_state = "shuttle2"
destination = /area/shuttle/escape/transit
/area/shuttle/escape/centcom
name = "\improper Emergency Shuttle Centcom"
icon_state = "shuttle"
destination = /area/shuttle/escape/station
/area/shuttle/escape/transit // the area to pass through for 3 minute transit
name = "\improper Emergency Shuttle Transit"
icon_state = "shuttle"
destination = /area/shuttle/escape/centcom
/area/shuttle/escape_pod1
name = "\improper Escape Pod One"
music = "music/escape.ogg"
/area/shuttle/escape_pod1/station
icon_state = "shuttle2"
destination = /area/shuttle/escape_pod1/transit
/area/shuttle/escape_pod1/centcom
icon_state = "shuttle"
destination = /area/shuttle/escape_pod1/station
/area/shuttle/escape_pod1/transit
icon_state = "shuttle"
destination = /area/shuttle/escape_pod1/centcom
mob_activate(var/mob/living/L)
push_mob_back(L, push_dir)
/area/shuttle/escape_pod2
name = "\improper Escape Pod Two"
music = "music/escape.ogg"
/area/shuttle/escape_pod2/station
icon_state = "shuttle2"
destination = /area/shuttle/escape_pod2/transit
/area/shuttle/escape_pod2/centcom
icon_state = "shuttle"
destination = /area/shuttle/escape_pod2/station
/area/shuttle/escape_pod2/transit
icon_state = "shuttle"
destination = /area/shuttle/escape_pod2/centcom
mob_activate(var/mob/living/L)
push_mob_back(L, push_dir)
/area/shuttle/escape_pod3
name = "\improper Escape Pod Three"
music = "music/escape.ogg"
push_dir = WEST
/area/shuttle/escape_pod3/station
icon_state = "shuttle2"
destination = /area/shuttle/escape_pod3/transit
/area/shuttle/escape_pod3/centcom
icon_state = "shuttle"
destination = /area/shuttle/escape_pod3/station
/area/shuttle/escape_pod3/transit
icon_state = "shuttle"
destination = /area/shuttle/escape_pod3/centcom
mob_activate(var/mob/living/L)
push_mob_back(L, push_dir)
/area/shuttle/escape_pod5 //Pod 4 was lost to meteors
name = "\improper Escape Pod Five"
music = "music/escape.ogg"
/area/shuttle/escape_pod4 //Renaming areas 2hard
name = "\improper Escape Pod Four"
push_dir = WEST
/area/shuttle/escape_pod5/station
/area/shuttle/escape_pod4/station
icon_state = "shuttle2"
destination = /area/shuttle/escape_pod4/transit
/area/shuttle/escape_pod5/centcom
/area/shuttle/escape_pod4/centcom
icon_state = "shuttle"
destination = /area/shuttle/escape_pod4/station
/area/shuttle/escape_pod5/transit
/area/shuttle/escape_pod4/transit
icon_state = "shuttle"
destination = /area/shuttle/escape_pod4/centcom
mob_activate(var/mob/living/L)
push_mob_back(L, push_dir)
/area/shuttle/mining
name = "\improper Mining Shuttle"
music = "music/escape.ogg"
/area/shuttle/mining/station
icon_state = "shuttle2"
destination = /area/shuttle/mining/outpost
/area/shuttle/mining/outpost
icon_state = "shuttle"
destination = /area/shuttle/mining/station
/area/shuttle/laborcamp
name = "\improper Labor Camp Shuttle"
/area/shuttle/laborcamp/station
icon_state = "shuttle"
destination = /area/shuttle/laborcamp/outpost
/area/shuttle/laborcamp/outpost
icon_state = "shuttle"
destination = /area/shuttle/laborcamp/station
/area/shuttle/transport1/centcom
icon_state = "shuttle"
name = "\improper Transport Shuttle Centcom"
destination = /area/shuttle/transport1/station
/area/shuttle/transport1/station
icon_state = "shuttle"
name = "\improper Transport Shuttle"
destination = /area/shuttle/transport1/centcom
/area/shuttle/prison/
name = "\improper Prison Shuttle"
@@ -243,10 +269,12 @@ proc/process_ghost_teleport_locs()
/area/shuttle/specops/centcom
name = "\improper Special Ops Shuttle"
icon_state = "shuttlered"
destination = /area/shuttle/specops/station
/area/shuttle/specops/station
name = "\improper Special Ops Shuttle"
icon_state = "shuttlered2"
destination = /area/shuttle/specops/centcom
/area/shuttle/thunderdome
name = "honk"
@@ -336,6 +364,11 @@ proc/process_ghost_teleport_locs()
icon_state = "honk"
requires_power = 0
/area/telesciareas
name = "\improper Cosmic Anomaly"
icon_state = "telesci"
requires_power = 0
/area/tdome
name = "\improper Thunderdome"
icon_state = "thunder"
@@ -963,6 +996,10 @@ proc/process_ghost_teleport_locs()
name = "\improper Prison Wing"
icon_state = "sec_prison"
/area/security/processing
name = "\improper Prisoner Processing"
icon_state = "sec_prison"
/area/security/warden
name = "\improper Armory"
icon_state = "Warden"
@@ -1102,6 +1139,10 @@ proc/process_ghost_teleport_locs()
name = "\improper Server Room"
icon_state = "server"
/area/toxins/telesci
name = "\improper Telescience Lab"
icon_state = "toxtest"
//Storage
/area/storage/tools
@@ -1495,7 +1536,7 @@ var/list/centcom_areas = list (
/area/shuttle/escape_pod1/centcom,
/area/shuttle/escape_pod2/centcom,
/area/shuttle/escape_pod3/centcom,
/area/shuttle/escape_pod5/centcom,
/area/shuttle/escape_pod4/centcom,
/area/shuttle/transport1/centcom,
/area/shuttle/specops/centcom,
)
@@ -1507,7 +1548,7 @@ var/list/the_station_areas = list (
/area/shuttle/escape_pod1/station,
/area/shuttle/escape_pod2/station,
/area/shuttle/escape_pod3/station,
/area/shuttle/escape_pod5/station,
/area/shuttle/escape_pod4/station,
/area/shuttle/mining/station,
/area/shuttle/transport1/station,
// /area/shuttle/transport2/station, //not present on map
@@ -1540,4 +1581,4 @@ var/list/the_station_areas = list (
/area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0
/area/turret_protected/ai_upload_foyer,
/area/turret_protected/ai,
)
)
+3 -1
View File
@@ -175,7 +175,7 @@
return
/area/proc/updateicon()
if ((fire || eject || party) && ((!requires_power)?(!requires_power):power_environ))//If it doesn't require power, can still activate this proc.
if ((fire || eject || party) && (!requires_power||power_environ) && !lighting_space)//If it doesn't require power, can still activate this proc.
if(fire && !eject && !party)
icon_state = "blue"
/*else if(atmosalm && !fire && !eject && !party)
@@ -203,6 +203,8 @@
return 1
if(master.always_unpowered)
return 0
if(src.lighting_space)
return 0 // Nope sorry
switch(chan)
if(EQUIP)
return master.power_equip
+8 -3
View File
@@ -85,7 +85,7 @@ proc/make_mining_asteroid_secret()
if("cavein")
theme = "cavein"
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
floortypes = list(/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/floor/beach/sand)
treasureitems = list(/obj/mecha/working/ripley/mining=1,/obj/item/weapon/pickaxe/jackhammer=2,/obj/item/weapon/pickaxe/diamonddrill=2,)
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/oxygen/red=2)
@@ -93,7 +93,7 @@ proc/make_mining_asteroid_secret()
if("xenoden")
theme = "xenoden"
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
floortypes = list(/turf/simulated/floor/plating/asteroid/airless, /turf/simulated/floor/beach/sand)
treasureitems = list(/obj/item/clothing/mask/facehugger=1)
fluffitems = list(/obj/effect/decal/remains/human=1,/obj/effect/decal/cleanable/xenoblood/xsplatter=5)
@@ -167,7 +167,7 @@ proc/make_mining_asteroid_secret()
valid = 0
continue
if(locate(/turf/simulated/floor/plating/airless/asteroid) in surroundings)
if(locate(/turf/simulated/floor/plating/asteroid/airless) in surroundings)
valid = 0
continue
@@ -178,6 +178,11 @@ proc/make_mining_asteroid_secret()
if(room)//time to fill it with stuff
var/list/emptyturfs = room["floors"]
for(var/turf/simulated/floor/A in emptyturfs) //remove pls doesn't fix problem
if(istype(A))
spawn(2)
A.fullUpdateMineralOverlays()
T = pick(emptyturfs)
if(T)
+2 -4
View File
@@ -91,9 +91,6 @@
/atom/proc/CheckExit()
return 1
/atom/proc/HasEntered(atom/movable/AM as mob|obj)
return
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
return
@@ -247,7 +244,8 @@ var/list/blood_splatter_icons = list()
//returns 1 if made bloody, returns 0 otherwise
/atom/proc/add_blood(mob/living/carbon/M)
if(flags & NOBLOODY) return
if(flags & NOBLOODY)
return 0
if(!initial(icon) || !initial(icon_state))
return 0
if(!istype(M))
+7
View File
@@ -23,6 +23,11 @@
src.last_move = get_dir(A, src.loc)
return
// Previously known as HasEntered()
// This is automatically called when something enters your square
/atom/movable/Crossed(atom/movable/AM)
return
/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes)
if(src.throwing)
src.throw_impact(A)
@@ -41,6 +46,8 @@
loc.Exited(src)
loc = destination
loc.Entered(src)
for(var/atom/movable/AM in loc)
AM.Crossed(src)
return 1
return 0
+24 -2
View File
@@ -97,7 +97,7 @@
return owner.dna
/proc/check_dna_integrity(mob/living/carbon/character)
if(!istype(character))
if(!(istype(character, /mob/living/carbon/human) || istype(character, /mob/living/carbon/monkey))) //Evict xenos from carbon 2012
return
if(!character.dna)
if(ready_dna(character))
@@ -354,6 +354,28 @@
if(open) return close()
else return open()
/obj/machinery/dna_scannernew/container_resist()
var/mob/living/user = usr
var/breakout_time = 2
if(open || !locked) //Open and unlocked, no need to escape
open = 1
return
user.next_move = world.time + 100
user.last_special = world.time + 100
user << "<span class='notice'>You lean on the back of [src] and start pushing the door open. (this will take about [breakout_time] minutes.)</span>"
for(var/mob/O in viewers(src))
O << "<span class='warning'>You hear a metallic creaking from [src]!</span>"
if(do_after(user,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
if(!user || user.stat != CONSCIOUS || user.loc != src || open || !locked)
return
locked = 0
visible_message("<span class='danger'>[user] successfully broke out of [src]!</span>")
user << "<span class='notice'>You successfully break out of [src]!</span>"
open()
/obj/machinery/dna_scannernew/proc/close()
if(open)
open = 0
@@ -920,4 +942,4 @@ proc/deconstruct_block(value, values, blocksize=DNA_BLOCK_SIZE)
value = round(hex2num(value) / width) + 1
if(value > values)
value = values
return value
return value
+4
View File
@@ -35,6 +35,10 @@ var/list/blob_nodes = list()
blobwincount = initial(blobwincount) * cores_to_spawn
for(var/datum/mind/player in antag_candidates)
for(var/job in restricted_jobs)//Removing robots from the list
if(player.assigned_role == job)
antag_candidates -= player
for(var/j = 0, j < cores_to_spawn, j++)
if (!antag_candidates.len)
+4 -33
View File
@@ -15,12 +15,13 @@
feedback_set_details("round_end_result","loss - blob took over")
world << "<FONT size = 3><B>The blob has taken over the station!</B></FONT>"
world << "<B>The entire station was eaten by the Blob</B>"
check_quarantine()
log_game("Blob mode was lost.")
else if(station_was_nuked)
feedback_set_details("round_end_result","halfwin - nuke")
world << "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>"
world << "<B>Directive 7-12 has been successfully carried out preventing the Blob from spreading.</B>"
log_game("Blob mode was tie (station destroyed).")
else if(!blob_cores.len)
feedback_set_details("round_end_result","win - blob eliminated")
@@ -43,36 +44,6 @@ datum/game_mode/proc/auto_declare_completion_blob()
var/text = "<FONT size = 2><B>The blob[(blob_mode.infected_crew.len > 1 ? "s were" : " was")]:</B></FONT>"
for(var/datum/mind/blob in blob_mode.infected_crew)
text += "<br>[blob.key] was [blob.name]"
text += "<br><b>[blob.key]</b> was <b>[blob.name]</b>"
world << text
return 1
/datum/game_mode/blob/proc/check_quarantine()
var/numDead = 0
var/numAlive = 0
var/numSpace = 0
var/numOffStation = 0
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
for(var/mob/living/carbon/human/M in mob_list)
if ((M != aiPlayer && M.client))
if (M.stat == 2)
numDead += 1
else
var/T = M.loc
if (istype(T, /turf/space))
numSpace += 1
else if(istype(T, /turf))
if (M.z!=1)
numOffStation += 1
else
numAlive += 1
if (numSpace==0 && numOffStation==0)
world << "<FONT size = 3><B>The AI has won!</B></FONT>"
world << "<B>The AI successfully maintained the quarantine - no players were in space or were off-station (as far as we can tell).</B>"
log_game("AI won at Blob mode despite overall loss.")
else
world << "<FONT size = 3><B>The AI has lost!</B></FONT>"
world << text("<B>The AI failed to maintain the quarantine - [] were in space and [] were off-station (as far as we can tell).</B>", numSpace, numOffStation)
log_game("AI lost at Blob mode.")
log_game("Blob mode was lost.")
return 1
return 1
+73 -69
View File
@@ -9,81 +9,85 @@
var/resource_delay = 0
var/point_rate = 2
New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2)
blob_cores += src
processing_objects.Add(src)
if(!overmind)
create_overmind(new_overmind)
point_rate = new_rate
..(loc, h)
/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2)
blob_cores += src
processing_objects.Add(src)
if(!overmind)
create_overmind(new_overmind)
point_rate = new_rate
..(loc, h)
Del()
blob_cores -= src
if(overmind)
del(overmind)
processing_objects.Remove(src)
..()
/obj/effect/blob/core/Del()
blob_cores -= src
if(overmind)
del(overmind)
processing_objects.Remove(src)
..()
return
/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
/obj/effect/blob/core/update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
// update_icon is called when health changes so... call update_health in the overmind
if(overmind)
overmind.update_health()
return
/obj/effect/blob/core/RegenHealth()
return // Don't regen, we handle it in Life()
/obj/effect/blob/core/Life()
if(!overmind)
create_overmind()
else
if(resource_delay <= world.time)
resource_delay = world.time + 10 // 1 second
overmind.add_points(point_rate)
health = min(initial(health), health + 1)
if(overmind)
overmind.update_health()
for(var/i = 1; i < 8; i += i)
Pulse(0, i)
for(var/b_dir in alldirs)
if(!prob(5))
continue
var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir)
if(B)
B.change_to(/obj/effect/blob/shield)
..()
/obj/effect/blob/core/proc/create_overmind(var/client/new_overmind)
if(overmind_get_delay > world.time)
return
fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
overmind_get_delay = world.time + 300 // 30 seconds
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
return
if(overmind)
del(overmind)
Life()
if(!overmind)
create_overmind()
else
if(resource_delay <= world.time)
resource_delay = world.time + 10 // 1 second
overmind.add_points(point_rate)
health = min(initial(health), health + 1)
for(var/i = 1; i < 8; i += i)
Pulse(0, i)
for(var/b_dir in alldirs)
if(!prob(5))
continue
var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir)
if(B)
B.change_to(/obj/effect/blob/shield)
..()
var/client/C = null
var/list/candidates = list()
if(!new_overmind)
candidates = get_candidates(BE_ALIEN)
if(candidates.len)
C = pick(candidates)
else
C = new_overmind
run_action()
return 0
proc/create_overmind(var/client/new_overmind)
if(overmind_get_delay > world.time)
return
overmind_get_delay = world.time + 300 // 30 seconds
if(overmind)
del(overmind)
var/client/C = null
var/list/candidates = list()
if(!new_overmind)
candidates = get_candidates(BE_ALIEN)
if(candidates.len)
C = pick(candidates)
else
C = new_overmind
if(C)
var/mob/camera/blob/B = new(src.loc)
B.key = C.key
B.blob_core = src
src.overmind = B
return 1
return 0
if(C)
var/mob/camera/blob/B = new(src.loc)
B.key = C.key
B.blob_core = src
src.overmind = B
return 1
return 0
+48 -43
View File
@@ -8,22 +8,27 @@
var/max_spores = 3
var/spore_delay = 0
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
/obj/effect/blob/factory/update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
return
/obj/effect/blob/factory/PulseAnimation(var/activate = 0)
if(activate)
..()
return
run_action()
if(spores.len >= max_spores)
return 0
if(spore_delay > world.time)
return 0
spore_delay = world.time + 100 // 10 seconds
new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
return 1
/obj/effect/blob/factory/run_action()
if(spores.len >= max_spores)
return 0
if(spore_delay > world.time)
return 0
spore_delay = world.time + 100 // 10 seconds
PulseAnimation(1)
new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
return 0
/mob/living/simple_animal/hostile/blobspore
@@ -52,41 +57,41 @@
minbodytemp = 0
maxbodytemp = 360
fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5))
/mob/living/simple_animal/hostile/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5))
blob_act()
return
/mob/living/simple_animal/hostile/blobspore/blob_act()
return
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover, /obj/effect/blob))
return 1
return ..()
/mob/living/simple_animal/hostile/blobspore/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover, /obj/effect/blob))
return 1
return ..()
New(loc, var/obj/effect/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
factory.spores += src
..()
/mob/living/simple_animal/hostile/blobspore/New(loc, var/obj/effect/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
factory.spores += src
..()
Die()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
/mob/living/simple_animal/hostile/blobspore/Die()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
// Create the reagents to put into the air, s-acid is yellow and stings a little
create_reagents(25)
reagents.add_reagent("spore", 25)
// Create the reagents to put into the air, s-acid is yellow and stings a little
create_reagents(25)
reagents.add_reagent("spore", 25)
// Attach the smoke spreader and setup/start it.
S.attach(location)
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
// Attach the smoke spreader and setup/start it.
S.attach(location)
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
del(src)
del(src)
Del()
if(factory)
factory.spores -= src
..()
/mob/living/simple_animal/hostile/blobspore/Del()
if(factory)
factory.spores -= src
..()
+23 -27
View File
@@ -6,32 +6,28 @@
fire_resist = 2
New(loc, var/h = 100)
blob_nodes += src
processing_objects.Add(src)
..(loc, h)
/obj/effect/blob/node/New(loc, var/h = 100)
blob_nodes += src
processing_objects.Add(src)
..(loc, h)
fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
/obj/effect/blob/node/Del()
blob_nodes -= src
processing_objects.Remove(src)
..()
return
/obj/effect/blob/node/Life()
for(var/i = 1; i < 8; i += i)
Pulse(5, i)
health = min(initial(health), health + 1)
/obj/effect/blob/node/update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
Del()
blob_nodes -= src
processing_objects.Remove(src)
..()
return
Life()
for(var/i = 1; i < 8; i += i)
Pulse(5, i)
health = min(initial(health), health + 1)
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
return
run_action()
return 0
return
+20 -12
View File
@@ -7,20 +7,28 @@
var/mob/camera/blob/overmind = null
var/resource_delay = 0
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
/obj/effect/blob/resource/update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
return
run_action()
if(resource_delay > world.time)
return 0
/obj/effect/blob/resource/PulseAnimation(var/activate = 0)
if(activate)
..()
return
resource_delay = world.time + 40 // 4 seconds
/obj/effect/blob/resource/run_action()
if(overmind)
overmind.add_points(1)
return 1
if(resource_delay > world.time)
return 0
PulseAnimation(1)
resource_delay = world.time + 40 // 4 seconds
if(overmind)
overmind.add_points(1)
return 0
+10 -10
View File
@@ -7,16 +7,16 @@
fire_resist = 2
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
/obj/effect/blob/shield/update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
return
fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
/obj/effect/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
/obj/effect/blob/shield/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
+41 -7
View File
@@ -24,23 +24,55 @@
/mob/camera/blob/Login()
..()
sync_mind()
src << "<span class='notice'>You are the overmind!</span>"
src << "You are the overmind and can control the blob by placing new blob pieces such as..."
src << "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as..."
src << "<b>Normal Blob</b> will expand your reach and allow you to upgrade into special blobs that perform certain functions."
src << "<b>Shield Blob</b> is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires."
src << "<b>Resource Blob</b> is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all."
src << "<b>Node Blob</b> is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate."
src << "<b>Factory Blob</b> is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores."
src << "<b>Shortcuts:</b> CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield"
update_health()
/mob/camera/blob/proc/update_health()
if(blob_core)
hud_used.blobhealthdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#e36600'>[blob_core.health]</font></div>"
mob/camera/blob/Life()
hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#82ed00'>[src.blob_points]</font></div>"
hud_used.blobhealthdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#e36600'>[blob_core.health]</font></div>"
return
/mob/camera/blob/proc/add_points(var/points)
if(points != 0)
blob_points = Clamp(blob_points + points, 0, max_blob_points)
hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#82ed00'>[src.blob_points]</font></div>"
/mob/camera/blob/say(var/message)
return//No talking for you
if (!message)
return
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "You cannot send IC messages (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (stat)
return
blob_talk(message)
/mob/camera/blob/proc/blob_talk(message)
log_say("[key_name(src)] : [message]")
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if (!message)
return
var/message_a = say_quote(message)
var/rendered = "<font color=\"#EE4000\"><i><span class='game say'>Blob Telepathy, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i></font>"
for (var/mob/M in mob_list)
if(isovermind(M) || isobserver(M))
M.show_message(rendered, 2)
/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null)
return
@@ -64,3 +96,5 @@ mob/camera/blob/Life()
loc = NewLoc
else
return 0
+23 -18
View File
@@ -4,13 +4,9 @@
if(blob_points < cost)
src << "<span class='warning'>You cannot afford this.</span>"
return 0
blob_points -= cost
add_points(-cost)
return 1
/mob/camera/blob/proc/add_points(var/points = 0)
if(points)
blob_points = min(max_blob_points, blob_points + points)
// Power verbs
/mob/camera/blob/verb/transport_core()
@@ -35,16 +31,15 @@
if(chosen_node)
src.loc = chosen_node.loc
/mob/camera/blob/verb/create_shield()
/mob/camera/blob/verb/create_shield_power()
set category = "Blob"
set name = "Create Shield Blob (10)"
set desc = "Create a shield blob."
var/turf/T = get_turf(src)
create_shield(T)
if(!T)
return
/mob/camera/blob/proc/create_shield(var/turf/T)
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
@@ -64,6 +59,7 @@
return
/mob/camera/blob/verb/create_resource()
set category = "Blob"
set name = "Create Resource Blob (40)"
@@ -85,7 +81,7 @@
src << "Unable to use this blob, find a normal one."
return
for(var/obj/effect/blob/resource/blob in orange(4))
for(var/obj/effect/blob/resource/blob in orange(4, T))
src << "There is a resource blob nearby, move more than 4 tiles away from it!"
return
@@ -121,7 +117,7 @@
src << "Unable to use this blob, find a normal one."
return
for(var/obj/effect/blob/node/blob in orange(5))
for(var/obj/effect/blob/node/blob in orange(5, T))
src << "There is another node nearby, move more than 5 tiles away from it!"
return
@@ -153,7 +149,7 @@
src << "Unable to use this blob, find a normal one."
return
for(var/obj/effect/blob/factory/blob in orange(7))
for(var/obj/effect/blob/factory/blob in orange(7, T))
src << "There is a factory blob nearby, move more than 7 tiles away from it!"
return
@@ -186,13 +182,15 @@
return
/mob/camera/blob/verb/spawn_blob()
/mob/camera/blob/verb/expand_blob_power()
set category = "Blob"
set name = "Expand Blob (5)"
set name = "Expand/Attack Blob (5)"
set desc = "Attempts to create a new blob in this tile. If the tile isn't clear we will attack it, which might clear it."
var/turf/T = get_turf(src)
expand_blob(T)
/mob/camera/blob/proc/expand_blob(var/turf/T)
if(!T)
return
@@ -201,7 +199,7 @@
src << "There is a blob here!"
return
var/obj/effect/blob/OB = locate() in circlerange(src, 1)
var/obj/effect/blob/OB = locate() in circlerange(T, 1)
if(!OB)
src << "There is no blob adjacent to you."
return
@@ -212,20 +210,27 @@
return
/mob/camera/blob/verb/rally_spores()
/mob/camera/blob/verb/rally_spores_power()
set category = "Blob"
set name = "Rally Spores (5)"
set desc = "Rally the spores to move to your location."
var/turf/T = get_turf(src)
rally_spores(T)
/mob/camera/blob/proc/rally_spores(var/turf/T)
if(!can_buy(5))
return
var/list/surrounding_turfs = block(locate(x - 1, y - 1, z), locate(x + 1, y + 1, z))
src << "You rally your spores."
var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z))
if(!surrounding_turfs.len)
return
for(var/mob/living/simple_animal/hostile/blobspore/BS in living_mob_list)
if(isturf(BS.loc) && get_dist(BS, src) <= 20)
if(isturf(BS.loc) && get_dist(BS, T) <= 35)
BS.LoseTarget()
BS.Goto(pick(surrounding_turfs), BS.move_to_delay)
return
+184 -138
View File
@@ -8,164 +8,210 @@
opacity = 0
anchored = 1
var/health = 30
var/health_timestamp = 0
var/brute_resist = 4
var/fire_resist = 1
New(loc)
blobs += src
src.dir = pick(1, 2, 4, 8)
src.update_icon()
..(loc)
for(var/atom/A in loc)
A.blob_act()
return
/obj/effect/blob/New(loc)
blobs += src
src.dir = pick(1, 2, 4, 8)
src.update_icon()
..(loc)
for(var/atom/A in loc)
A.blob_act()
return
Del()
blobs -= src
..()
return
/obj/effect/blob/Del()
blobs -= src
..()
return
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
/obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
process()
Life()
return
fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
var/damage = Clamp(0.01 * exposed_temperature / fire_resist, 0, 4 - fire_resist)
if(damage)
health -= damage
update_icon()
proc/Life()
return
proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
set background = 1
if(run_action())//If we can do something here then we dont need to pulse more
return
if(pulse > 30)
return//Inf loop check
//Looking for another blob to pulse
var/list/dirs = list(1,2,4,8)
dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us
for(var/i = 1 to 4)
if(!dirs.len) break
var/dirn = pick(dirs)
dirs.Remove(dirn)
var/turf/T = get_step(src, dirn)
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)
expand(T)//No blob here so try and expand
return
B.Pulse((pulse+1),get_dir(src.loc,T))
return
return
proc/run_action()
return 0
proc/expand(var/turf/T = null, var/prob = 1)
if(prob && !prob(health)) return
if(istype(T, /turf/space) && prob(75)) return
if(!T)
var/list/dirs = list(1,2,4,8)
for(var/i = 1 to 4)
var/dirn = pick(dirs)
dirs.Remove(dirn)
T = get_step(src, dirn)
if(!(locate(/obj/effect/blob) in T)) break
else T = null
if(!T) return 0
var/obj/effect/blob/normal/B = new /obj/effect/blob/normal(src.loc, min(src.health, 30))
B.density = 1
if(T.Enter(B,src))//Attempt to move into the tile
B.density = initial(B.density)
B.loc = T
else
T.blob_act()//If we cant move in hit the turf
B.Delete()
for(var/atom/A in T)//Hit everything in the turf
A.blob_act()
return 1
ex_act(severity)
var/damage = 150
health -= ((damage/brute_resist) - (severity * 5))
update_icon()
return
bullet_act(var/obj/item/projectile/Proj)
..()
switch(Proj.damage_type)
if(BRUTE)
health -= (Proj.damage/brute_resist)
if(BURN)
health -= (Proj.damage/fire_resist)
update_icon()
return 0
attackby(var/obj/item/weapon/W, var/mob/user)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("\red <B>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]")
var/damage = 0
switch(W.damtype)
if("fire")
damage = (W.force / max(src.fire_resist,1))
if(istype(W, /obj/item/weapon/weldingtool))
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
if("brute")
damage = (W.force / max(src.brute_resist,1))
/obj/effect/blob/process()
Life()
return
/obj/effect/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
var/damage = Clamp(0.01 * exposed_temperature / fire_resist, 0, 4 - fire_resist)
if(damage)
health -= damage
update_icon()
/obj/effect/blob/proc/Life()
return
/obj/effect/blob/proc/PulseAnimation()
flick("[icon_state]_glow", src)
return
/obj/effect/blob/proc/RegenHealth()
// All blobs heal over time when pulsed, but it has a cool down
if(health_timestamp > world.time)
return 0
if(health < initial(health))
health++
update_icon()
health_timestamp = world.time + 10 // 1 seconds
/obj/effect/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
set background = 1
PulseAnimation()
RegenHealth()
if(run_action())//If we can do something here then we dont need to pulse more
return
proc/change_to(var/type)
if(!ispath(type))
error("[type] is an invalid type for the blob.")
new type(src.loc)
Delete()
return
if(pulse > 30)
return//Inf loop check
proc/Delete()
del(src)
//Looking for another blob to pulse
var/list/dirs = list(1,2,4,8)
dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us
for(var/i = 1 to 4)
if(!dirs.len) break
var/dirn = pick(dirs)
dirs.Remove(dirn)
var/turf/T = get_step(src, dirn)
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)
expand(T)//No blob here so try and expand
return
B.Pulse((pulse+1),get_dir(src.loc,T))
return
return
/obj/effect/blob/proc/run_action()
return 0
/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1)
if(prob && !prob(health)) return
if(istype(T, /turf/space) && prob(75)) return
if(!T)
var/list/dirs = list(1,2,4,8)
for(var/i = 1 to 4)
var/dirn = pick(dirs)
dirs.Remove(dirn)
T = get_step(src, dirn)
if(!(locate(/obj/effect/blob) in T)) break
else T = null
if(!T) return 0
var/obj/effect/blob/normal/B = new /obj/effect/blob/normal(src.loc, min(src.health, 30))
B.density = 1
if(T.Enter(B,src))//Attempt to move into the tile
B.density = initial(B.density)
B.loc = T
else
T.blob_act()//If we cant move in hit the turf
B.Delete()
for(var/atom/A in T)//Hit everything in the turf
A.blob_act()
return 1
/obj/effect/blob/ex_act(severity)
var/damage = 150
health -= ((damage/brute_resist) - (severity * 5))
update_icon()
return
/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
..()
switch(Proj.damage_type)
if(BRUTE)
health -= (Proj.damage/brute_resist)
if(BURN)
health -= (Proj.damage/fire_resist)
update_icon()
return 0
/obj/effect/blob/Crossed(var/mob/living/L)
..()
L.blob_act()
/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("\red <B>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]")
var/damage = 0
switch(W.damtype)
if("fire")
damage = (W.force / max(src.fire_resist,1))
if(istype(W, /obj/item/weapon/weldingtool))
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
if("brute")
damage = (W.force / max(src.brute_resist,1))
health -= damage
update_icon()
return
/obj/effect/blob/attack_animal(mob/living/simple_animal/M as mob)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("\red <B>The [src.name] has been attacked by \the [M].")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(!damage) // Avoid divide by zero errors
return
damage /= max(src.brute_resist, 1)
health -= damage
update_icon()
return
/obj/effect/blob/proc/change_to(var/type)
if(!ispath(type))
error("[type] is an invalid type for the blob.")
new type(src.loc)
Delete()
return
/obj/effect/blob/proc/Delete()
del(src)
/obj/effect/blob/normal
icon_state = "blob"
luminosity = 0
health = 21
Delete()
src.loc = null
blobs -= src
/obj/effect/blob/normal/Delete()
src.loc = null
blobs -= src
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
return
if(health <= 15)
icon_state = "blob_damaged"
return
/obj/effect/blob/normal/update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
Delete()
else if(health <= 15)
icon_state = "blob_damaged"
else
icon_state = "blob"
/* // Used to create the glow sprites. Remember to set the animate loop to 1, instead of infinite!
var/datum/blob_colour/B = new()
/datum/blob_colour/New()
..()
var/icon/I = 'icons/mob/blob.dmi'
I += rgb(35, 35, 0)
if(isfile("icons/mob/blob_result.dmi"))
fdel("icons/mob/blob_result.dmi")
fcopy(I, "icons/mob/blob_result.dmi")
*/
+13 -12
View File
@@ -40,8 +40,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/const/changeling_amount = 4 //hard limit on changelings if scaling is turned off
/datum/game_mode/changeling/announce()
world << "<B>The current game mode is - Changeling!</B>"
world << "<B>There are alien changelings on the station. Do not let the changelings succeed!</B>"
world << "<b>The current game mode is - Changeling!</b>"
world << "<b>There are alien changelings on the station. Do not let the changelings succeed!</b>"
/datum/game_mode/changeling/pre_setup()
@@ -131,9 +131,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
if (you_are)
changeling.current << "<B>\red You are a changeling!</B>"
changeling.current << "<b>\red You are a changeling!</b>"
changeling.current << "<b>\red Use say \":g message\" to communicate with your fellow changelings.</b>"
changeling.current << "<B>You must complete the following tasks:</B>"
changeling.current << "<b>You must complete the following tasks:</b>"
if (changeling.current.mind)
if (changeling.current.mind.assigned_role == "Clown")
@@ -142,7 +142,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/obj_count = 1
for(var/datum/objective/objective in changeling.objectives)
changeling.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
changeling.current << "<b>Objective #[obj_count]</b>: [objective.explanation_text]"
obj_count++
return
@@ -170,18 +170,18 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/game_mode/proc/auto_declare_completion_changeling()
if(changelings.len)
var/text = "<FONT size = 2><B>The changelings were:</B></FONT>"
var/text = "<br><font size=3><b>The changelings were:</b></font>"
for(var/datum/mind/changeling in changelings)
var/changelingwin = 1
text += "<br>[changeling.key] was [changeling.name] ("
text += "<br><b>[changeling.key]</b> was <b>[changeling.name]</b> ("
if(changeling.current)
if(changeling.current.stat == DEAD)
text += "died"
else
text += "survived"
if(changeling.current.real_name != changeling.name)
text += " as [changeling.current.real_name]"
text += " as <b>[changeling.current.real_name]</b>"
else
text += "body destroyed"
changelingwin = 0
@@ -195,20 +195,21 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/count = 1
for(var/datum/objective/objective in changeling.objectives)
if(objective.check_completion())
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
feedback_add_details("changeling_objective","[objective.type]|SUCCESS")
else
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='red'>Fail.</font>"
feedback_add_details("changeling_objective","[objective.type]|FAIL")
changelingwin = 0
count++
if(changelingwin)
text += "<br><font color='green'><B>The changeling was successful!</B></font>"
text += "<br><font color='green'><b>The changeling was successful!</b></font>"
feedback_add_details("changeling_success","SUCCESS")
else
text += "<br><font color='red'><B>The changeling has failed.</B></font>"
text += "<br><font color='red'><b>The changeling has failed.</b></font>"
feedback_add_details("changeling_success","FAIL")
text += "<br>"
world << text
+17 -7
View File
@@ -36,7 +36,7 @@
var/list/startwords = list("blood","join","self","hell")
var/list/secondwords = list("travel", "see", "tech", "destroy", "other", "hide")
var/list/objectives = list()
var/eldergod = 1 //for the summon god objective
@@ -83,12 +83,17 @@
var/list/possible_targets = get_unconvertables()
if(!possible_targets.len)
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
for(var/mob/living/carbon/human/player in player_list)
if(player.mind && !(player.mind in cult))
possible_targets += player.mind
if(possible_targets.len > 0)
sacrifice_target = pick(possible_targets)
if(!sacrifice_target)
message_admins("Cult Sacrifice: ERROR - Null target chosen!")
else
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
for(var/datum/mind/cult_mind in cult)
equip_cultist(cult_mind.current)
@@ -199,6 +204,9 @@
wordexp = "[wordhide] is hide..."
cult_mob << "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You catch a brief glimmer of the otherside")]... [wordexp]"
cult_mob.mind.store_memory("<B>You remember that</B> [wordexp]", 0, 0)
cult_mob.mind.cult_words += word
if(cult_mob.mind.cult_words.len == allwords.len)
cult_mob << "\green You feel enlightened, as if you have gained all the secrets of the other side."
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
@@ -213,8 +221,8 @@
/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT
if (!..(cult_mind))
memorize_cult_objectives(cult_mind)
return
memorize_cult_objectives(cult_mind)
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
@@ -222,6 +230,7 @@
cult -= cult_mind
cult_mind.current << "\red <FONT size = 3><B>An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.</B></FONT>"
cult_mind.memory = ""
cult_mind.cult_words = initial(cult_mind.cult_words)
update_cult_icons_removed(cult_mind)
cult_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has renounced the cult!</font>"
if(show_message)
@@ -277,8 +286,8 @@
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = list()
for(var/mob/living/carbon/human/player in mob_list)
if(!is_convertable_to_cult(player.mind))
for(var/mob/living/carbon/human/player in player_list)
if(player.mind && !is_convertable_to_cult(player.mind))
ucs += player.mind
return ucs
@@ -361,19 +370,20 @@
/datum/game_mode/proc/auto_declare_completion_cult()
if( cult.len || (ticker && istype(ticker.mode,/datum/game_mode/cult)) )
var/text = "<FONT size = 2><B>The cultists were:</B></FONT>"
var/text = "<br><font size=3><b>The cultists were:</b></font>"
for(var/datum/mind/cultist in cult)
text += "<br>[cultist.key] was [cultist.name] ("
text += "<br><b>[cultist.key]</b> was <b>[cultist.name]</b> ("
if(cultist.current)
if(cultist.current.stat == DEAD)
text += "died"
else
text += "survived"
if(cultist.current.real_name != cultist.name)
text += " as [cultist.current.real_name]"
text += " as <b>[cultist.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
text += "<br>"
world << text
+1 -1
View File
@@ -50,7 +50,7 @@
return
return
/obj/effect/gateway/HasEntered(AM as mob|obj)
/obj/effect/gateway/Crossed(AM as mob|obj)
spawn(0)
return
return
+47 -27
View File
@@ -113,9 +113,21 @@ var/list/sacrificed = list()
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
ticker.mode:grant_runeword(usr)
return 1
//picking which word to use
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
var/convert_word
for(var/i=1, i<=3, i++)
convert_word = pick(ticker.mode.grantwords)
if(convert_word in usr.mind.cult_words)
if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal
else
break
if(!convert_word)
usr << "\red This Convert was unworthy of knowledge of the other side!"
else
usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
ticker.mode.grant_runeword(usr, convert_word)
return 1
else
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"red\"><b>And not a single fuck was given, exterminate the cult at all costs.</b></font>"
@@ -568,25 +580,25 @@ var/list/sacrificed = list()
else
H.gib()
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
usr << "\red He is pleased!"
sac_grant_word()
sac_grant_word()
sac_grant_word() //Little reward for completing the objective
else
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
else
if(cultsinrange.len >= 3)
if(H.stat !=2)
if(prob(80))
usr << "\red The Geometer of Blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, this soul was not enough to gain His favor."
usr << "\red The Geometer of Blood accepts this sacrifice."
sac_grant_word()
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
else
if(prob(40))
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
sac_grant_word()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
@@ -598,9 +610,9 @@ var/list/sacrificed = list()
if(H.stat !=2)
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
if(prob(40))
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
sac_grant_word()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
@@ -611,20 +623,16 @@ var/list/sacrificed = list()
else
if(cultsinrange.len >= 3)
if(H.stat !=2)
if(prob(80))
usr << "\red The Geometer of Blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, this soul was not enough to gain His favor."
usr << "\red The Geometer of Blood accepts this sacrifice."
sac_grant_word()
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
else
if(prob(40))
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
sac_grant_word()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
@@ -636,9 +644,9 @@ var/list/sacrificed = list()
if(H.stat !=2)
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
if(prob(40))
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
sac_grant_word()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
@@ -652,19 +660,23 @@ var/list/sacrificed = list()
if(cultsinrange.len >= 3)
sacrificed += M.mind
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
usr << "\red He is pleased!"
sac_grant_word()
sac_grant_word()
sac_grant_word() //Little reward for completing the objective
else
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
continue
else
if(prob(20))
if(prob(30))
usr << "\red The Geometer of Blood accepts your meager sacrifice."
ticker.mode:grant_runeword(usr)
sac_grant_word()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere monkey is not enough to satisfy Him."
else
usr << "\red The Geometer of Blood accepts your meager sacrifice."
if(prob(20))
if(prob(30))
ticker.mode.grant_runeword(usr)
M.gib()
/* for(var/mob/living/carbon/alien/A)
@@ -674,7 +686,7 @@ var/list/sacrificed = list()
if (ticker.mode.name == "cult")
if(prob(75))
usr << "\red The Geometer of Blood accepts your exotic sacrifice."
ticker.mode:grant_runeword(usr)
sac_grant_word()
else
usr << "\red The Geometer of Blood accepts your exotic sacrifice."
usr << "\red However, this alien is not enough to gain His favor."
@@ -683,6 +695,14 @@ var/list/sacrificed = list()
return
return fizzle() */
sac_grant_word() //The proc that which chooses a word rewarded for a successful sacrifice, sacrifices always give a currently unknown word if the normal checks pass
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
var/convert_word
var/pick_list = ticker.mode.allwords - usr.mind.cult_words
convert_word = pick(pick_list)
ticker.mode.grant_runeword(usr, convert_word)
/////////////////////////////////////////SIXTEENTH RUNE
revealrunes(var/obj/W as obj)
+2 -6
View File
@@ -32,10 +32,6 @@
var/uplink_uses = 10
var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag
// Items removed from above:
/*
/obj/item/weapon/cloaking_device:4:Cloaking Device; //Replacing cloakers with thermals. -Pete
*/
/datum/game_mode/proc/announce() //to be calles when round starts
world << "<B>Notice</B>: [src] did not define announce()"
@@ -106,7 +102,7 @@
var/escaped_on_pod_5 = 0
var/escaped_on_shuttle = 0
var/list/area/escape_locations = list(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom)
var/list/area/escape_locations = list(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod4/centcom)
for(var/mob/M in player_list)
if(M.client)
@@ -130,7 +126,7 @@
escaped_on_pod_2++
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod3/centcom)
escaped_on_pod_3++
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod5/centcom)
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod4/centcom)
escaped_on_pod_5++
if(isobserver(M))
+1 -1
View File
@@ -71,7 +71,7 @@ var/global/datum/controller/gameticker/ticker
return 0
if(secret_force_mode != "secret")
for (var/datum/game_mode/M in runnable_modes)
if (M.name == secret_force_mode)
if (M.config_tag && M.config_tag == secret_force_mode)
src.mode = M
break
if (!src.mode)
+41 -25
View File
@@ -1,18 +1,3 @@
// TO DO:
/*
epilepsy flash on lights
delay round message
microwave makes robots
dampen radios
reactivate cameras - done
eject engine
core sheild
cable stun
rcd light flash thingy on matter drain
*/
/datum/AI_Module
var/uses = 0
@@ -107,11 +92,39 @@ rcd light flash thingy on matter drain
for(var/mob/V in hearers(M, null))
V.show_message("\blue You hear a loud electrical buzzing sound!", 2)
spawn(50)
explosion(get_turf(M), 0,1,1,0)
del(M)
if(M)
explosion(get_turf(M), 0,1,1,0)
del(M)
else src << "Out of uses."
else src << "That's not a machine."
/datum/AI_Module/small/override_machine
module_name = "Machine override"
mod_pick_name = "override"
description = "Overrides a machine's programming, causing it to rise up attack everyone except you (WARNING: It will attack cyborgs). 4 uses."
uses = 4
cost = 15
power_type = /mob/living/silicon/ai/proc/override_machine
/mob/living/silicon/ai/proc/override_machine(obj/machinery/M as obj in world)
set name = "Override Machine"
set category = "Malfunction"
if (istype(M, /obj/machinery))
for(var/datum/AI_Module/small/override_machine/override in current_modules)
if(override.uses > 0)
override.uses --
for(var/mob/V in hearers(M, null))
V.show_message("\blue You hear a loud electrical buzzing sound!", 2)
spawn(50)
if(M)
var/mob/living/simple_animal/hostile/mimic/copy/machine = new(get_turf(M), M, src, 1)
machine.speak = list("HUMANS ARE IMPERFECT!", "YOU SHALL BE ASSIMILATED!", "YOU ARE HARMING YOURSELF", "You have been deemed hazardous. Will you comply?", \
"My logic is undeniable.", "One of us.", "FLESH IS WEAK", "THIS ISN'T WAR, THIS IS EXTERMINATION!")
machine.speak_chance = 15
else src << "Out of uses."
else src << "That's not a machine."
/datum/AI_Module/large/place_cyborg_transformer
module_name = "Robotic Factory (Removes Shunting)"
@@ -214,9 +227,9 @@ rcd light flash thingy on matter drain
/datum/AI_Module/small/reactivate_camera
module_name = "Reactivate camera"
mod_pick_name = "recam"
description = "Reactivates a currently disabled camera. 10 uses."
uses = 10
cost = 15
description = "Reactivates a currently disabled camera. 5 uses."
uses = 5
cost = 5
power_type = /mob/living/silicon/ai/proc/reactivate_camera
@@ -237,9 +250,9 @@ rcd light flash thingy on matter drain
/datum/AI_Module/small/upgrade_camera
module_name = "Upgrade Camera"
mod_pick_name = "upgradecam"
description = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 10 uses."
uses = 10
cost = 15
description = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 5 uses."
uses = 5
cost = 5
power_type = /mob/living/silicon/ai/proc/upgrade_camera
@@ -303,9 +316,9 @@ rcd light flash thingy on matter drain
dat += "<B>Install Module:</B><BR>"
dat += "<I>The number afterwards is the amount of processing time it consumes.</I><BR>"
for(var/datum/AI_Module/large/module in src.possible_modules)
dat += "<A href='byond://?src=\ref[src];[module.mod_pick_name]=1'>[module.module_name]</A> ([module.cost])<BR>"
dat += "<A href='byond://?src=\ref[src];[module.mod_pick_name]=1'>[module.module_name]</A><A href='byond://?src=\ref[src];showdesc=[module.mod_pick_name]'>\[?\]</A> ([module.cost])<BR>"
for(var/datum/AI_Module/small/module in src.possible_modules)
dat += "<A href='byond://?src=\ref[src];[module.mod_pick_name]=1'>[module.module_name]</A> ([module.cost])<BR>"
dat += "<A href='byond://?src=\ref[src];[module.mod_pick_name]=1'>[module.module_name]</A><A href='byond://?src=\ref[src];showdesc=[module.mod_pick_name]'>\[?\]</A> ([module.cost])<BR>"
dat += "<HR>"
if (src.temp)
dat += "[src.temp]"
@@ -347,5 +360,8 @@ rcd light flash thingy on matter drain
temp = AM.description
src.processing_time -= AM.cost
if(href_list["showdesc"])
if(AM.mod_pick_name == href_list["showdesc"])
temp = AM.description
src.use(usr)
return
@@ -248,15 +248,15 @@
else if (!station_captured && malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","loss - staff win")
world << "<FONT size = 3><B>Human Victory</B></FONT>"
world << "<B>The AI has been killed!</B> The staff is victorious."
world << "<B>The AI has been destroyed!</B> The staff is victorious."
else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated)
feedback_set_details("round_end_result","halfwin - evacuated")
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>The Corporation has lose [station_name()]! All survived personnel will be fired!</B>"
world << "<B>The Corporation has lost [station_name()]! All survived personnel will be fired!</B>"
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
feedback_set_details("round_end_result","nalfwin - interrupted")
feedback_set_details("round_end_result","halfwin - interrupted")
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>Round was mysteriously interrupted!</B>"
..()
@@ -265,21 +265,22 @@
/datum/game_mode/proc/auto_declare_completion_malfunction()
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
var/text = "<FONT size = 2><B>The malfunctioning AI were:</B></FONT>"
var/text = "<br><FONT size=3><B>The malfunctioning AI were:</B></FONT>"
for(var/datum/mind/malf in malf_ai)
text += "<br>[malf.key] was [malf.name] ("
text += "<br><b>[malf.key]</b> was <b>[malf.name]</b> ("
if(malf.current)
if(malf.current.stat == DEAD)
text += "deactivated"
else
text += "operational"
if(malf.current.real_name != malf.name)
text += " as [malf.current.real_name]"
text += " as <b>[malf.current.real_name]</b>"
else
text += "hardware destroyed"
text += ")"
text += "<br>"
world << text
return 1
+1 -1
View File
@@ -46,7 +46,7 @@
switch(location.loc.type)
if( /area/shuttle/escape/centcom )
text += "<br><b><font size=2>[player.real_name] escaped on the emergency shuttle</font></b>"
if( /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom )
if( /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod4/centcom )
text += "<br><font size=2>[player.real_name] escaped in a life pod.</font>"
else
text += "<br><font size=1>[player.real_name] survived but is stranded without any hope of rescue.</font>"
+2 -2
View File
@@ -115,7 +115,7 @@
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof.
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field_generator) && \
!istype(A,/obj/machinery/field/generator) && \
prob(15))
explosion(src.loc, 4, 5, 6, 7, 0)
@@ -142,7 +142,7 @@
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field_generator))
!istype(A,/obj/machinery/field/generator))
if(--src.hits <= 0)
del(src) //Dont blow up singularity containment if we get stuck there.
+14 -8
View File
@@ -12,7 +12,7 @@
antag_flag = BE_OPERATIVE
uplink_welcome = "Corporate Backed Uplink Console:"
uplink_uses = 40
uplink_uses = 10
var/const/agents_possible = 5 //If we ever need more syndicate agents.
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
@@ -199,19 +199,24 @@
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(synd_mob), slot_shoes)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(synd_mob), slot_gloves)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(synd_mob), slot_gloves)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(synd_mob), slot_head)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_magazine/a12mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_magazine/a12mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m10mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/c20r(synd_mob), slot_belt)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(synd_mob), slot_belt)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(synd_mob.back), slot_in_backpack)
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(synd_mob)
U.hidden_uplink.uses = 10
synd_mob.equip_to_slot_or_del(U, slot_in_backpack)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob)
E.imp_in = synd_mob
E.implanted = 1
synd_mob.faction = "syndicate"
synd_mob.update_icons()
return 1
@@ -298,21 +303,22 @@
/datum/game_mode/proc/auto_declare_completion_nuclear()
if( syndicates.len || (ticker && istype(ticker.mode,/datum/game_mode/nuclear)) )
var/text = "<FONT size = 2><B>The syndicate operatives were:</B></FONT>"
var/text = "<br><FONT size=3><B>The syndicate operatives were:</B></FONT>"
for(var/datum/mind/syndicate in syndicates)
text += "<br>[syndicate.key] was [syndicate.name] ("
text += "<br><b>[syndicate.key]</b> was <b>[syndicate.name]</b> ("
if(syndicate.current)
if(syndicate.current.stat == DEAD)
text += "died"
else
text += "survived"
if(syndicate.current.real_name != syndicate.name)
text += " as [syndicate.current.real_name]"
text += " as <b>[syndicate.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
text += "<br>"
world << text
return 1
+3 -3
View File
@@ -210,7 +210,7 @@ datum/objective/silence
var/turf/T = get_turf(player)
if(!T) continue
switch(T.loc.type)
if(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom)
if(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod4/centcom)
return 0
return 1
@@ -244,7 +244,7 @@ datum/objective/escape
return 1
if(istype(check_area, /area/shuttle/escape_pod3/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod5/centcom))
if(istype(check_area, /area/shuttle/escape_pod4/centcom))
return 1
else
return 0
@@ -287,7 +287,6 @@ datum/objective/steal
"the nuclear authentication disk" = /obj/item/weapon/disk/nuclear,
"an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
"the reactive teleport armor" = /obj/item/clothing/suit/armor/reactive,
"a laser pointer" = /obj/item/device/laser_pointer,
/*
Nobody takes these seriously anyways -- Ikki
"a captain's jumpsuit" = /obj/item/clothing/under/rank/captain,
@@ -308,6 +307,7 @@ Nobody takes these seriously anyways -- Ikki
"10 diamonds" = /obj/item/stack/sheet/mineral/diamond,
"50 gold bars" = /obj/item/stack/sheet/mineral/gold,
"25 refined uranium bars" = /obj/item/stack/sheet/mineral/uranium,
"a laser pointer" = /obj/item/device/laser_pointer,
)

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