mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 23:27:34 +01:00
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:
+4
-5
@@ -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
|
||||
|
||||
@@ -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.)
|
||||
|
||||
----------------------------------------------------
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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 ..()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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/////
|
||||
//////////////////////////
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)]°C"
|
||||
else
|
||||
user << "\blue [target] is empty!"
|
||||
return
|
||||
return
|
||||
|
||||
+12
-117
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
|
||||
@@ -16,4 +16,4 @@
|
||||
|
||||
|
||||
/datum/debug
|
||||
var/list/debuglist
|
||||
var/list/debuglist
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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))
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
*/
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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>"
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user