Merge branch 'master' into upstream-merge-31599

This commit is contained in:
LetterJay
2017-10-12 11:00:37 -04:00
committed by GitHub
100 changed files with 1598 additions and 1196 deletions
+2 -2
View File
@@ -3305,7 +3305,7 @@
"ga" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
on = 1
},
/turf/open/floor/plasteel/floorgrime{
@@ -3719,7 +3719,7 @@
"gO" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "n2o";
filter_type = /datum/gas/nitrous_oxide;
on = 1
},
/turf/open/floor/plasteel/floorgrime{
+2 -2
View File
@@ -14187,7 +14187,7 @@
"um" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4;
filter_type = "n2";
filter_type = /datum/gas/nitrogen;
on = 1
},
/turf/open/floor/plasteel/red/side{
@@ -14236,7 +14236,7 @@
"up" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
on = 1
},
/turf/open/floor/plasteel/blue/side{
+8 -8
View File
@@ -27778,7 +27778,6 @@
/obj/structure/table,
/obj/item/folder/white,
/obj/item/device/radio/headset/headset_med,
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"boe" = (
@@ -37450,6 +37449,7 @@
/obj/item/circuitboard/machine/clonescanner,
/obj/item/circuitboard/machine/clonepod,
/obj/item/circuitboard/computer/scan_consolenew,
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plating,
/area/storage/tech)
"bJl" = (
@@ -43123,7 +43123,7 @@
"bWb" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "n2o";
filter_type = /datum/gas/nitrous_oxide;
on = 1
},
/turf/open/floor/plasteel,
@@ -44684,7 +44684,7 @@
"bZJ" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "plasma";
filter_type = /datum/gas/plasma;
on = 1
},
/turf/open/floor/plasteel,
@@ -46475,7 +46475,7 @@
"cdB" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "co2";
filter_type = /datum/gas/carbon_dioxide;
on = 1
},
/turf/open/floor/plasteel,
@@ -47103,7 +47103,7 @@
"cfi" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 2;
filter_type = "n2";
filter_type = /datum/gas/nitrogen;
on = 1
},
/turf/open/floor/plasteel,
@@ -47355,7 +47355,7 @@
"cfR" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
on = 1
},
/turf/open/floor/plasteel,
@@ -57434,7 +57434,7 @@
"cGf" = (
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
dir = 8;
filter_type = "n2"
filter_type = /datum/gas/nitrogen
},
/turf/open/floor/engine,
/area/engine/engineering)
@@ -58550,7 +58550,7 @@
"cSJ" = (
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
dir = 8;
filter_type = "freon";
filter_type = /datum/gas/freon;
name = "gas filter (freon)"
},
/turf/open/floor/engine,
@@ -6987,7 +6987,7 @@
},
/obj/machinery/atmospherics/components/trinary/filter/critical{
dir = 4;
filter_type = "n2"
filter_type = /datum/gas/nitrogen
},
/turf/open/floor/plasteel/neutral,
/area/engine/atmospherics_engine)
@@ -10811,7 +10811,7 @@
/area/shuttle/supply)
"aza" = (
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
filter_type = "n2";
filter_type = /datum/gas/nitrogen;
name = "nitrogen filter"
},
/turf/open/floor/plasteel/yellow,
@@ -23007,7 +23007,7 @@
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/components/trinary/filter{
dir = 2;
filter_type = "co2";
filter_type = /datum/gas/carbon_dioxide;
name = "co2 filter";
on = 1
},
@@ -24580,7 +24580,7 @@
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
name = "oxygen filter";
on = 1
},
@@ -25841,7 +25841,7 @@
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/components/trinary/filter{
dir = 2;
filter_type = "plasma";
filter_type = /datum/gas/plasma;
name = "waste filter";
on = 1
},
@@ -27484,7 +27484,7 @@
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "n2";
filter_type = /datum/gas/nitrogen;
name = "nitrogen filter";
on = 1
},
@@ -29207,7 +29207,7 @@
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/components/trinary/filter{
dir = 2;
filter_type = "n2o";
filter_type = /datum/gas/nitrous_oxide;
name = "n2o filter";
on = 1
},
@@ -39367,6 +39367,7 @@
pixel_y = -3
},
/obj/effect/turf_decal/bot,
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel,
/area/storage/tech)
"bAP" = (
@@ -77224,7 +77225,6 @@
/obj/structure/table/glass,
/obj/item/clipboard,
/obj/item/toy/figure/chemist,
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel/whiteyellow/corner{
dir = 1
},
@@ -105710,7 +105710,7 @@
},
/obj/machinery/atmospherics/components/trinary/filter/critical{
dir = 4;
filter_type = "freon";
filter_type = /datum/gas/freon;
name = "gas filter (freon)"
},
/turf/open/floor/plasteel/neutral,
+8 -8
View File
@@ -27681,6 +27681,7 @@
/obj/item/circuitboard/machine/clonescanner,
/obj/item/circuitboard/machine/clonepod,
/obj/item/circuitboard/computer/scan_consolenew,
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel/black,
/area/storage/tech)
"bbo" = (
@@ -46859,7 +46860,7 @@
"bMk" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "n2o";
filter_type = /datum/gas/nitrous_oxide;
on = 1
},
/obj/structure/window/reinforced{
@@ -49916,7 +49917,7 @@
"bSj" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "plasma";
filter_type = /datum/gas/plasma;
on = 1
},
/obj/structure/window/reinforced{
@@ -52635,7 +52636,7 @@
"bXq" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "co2";
filter_type = /datum/gas/carbon_dioxide;
on = 1
},
/obj/structure/window/reinforced{
@@ -54519,7 +54520,7 @@
"cbd" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4;
filter_type = "n2";
filter_type = /datum/gas/nitrogen;
on = 1
},
/obj/structure/window/reinforced,
@@ -54574,7 +54575,7 @@
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
on = 1
},
/turf/open/floor/plasteel/blue,
@@ -59764,7 +59765,6 @@
dir = 1;
pixel_y = -24
},
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel/whiteyellow{
dir = 4
},
@@ -82679,7 +82679,7 @@
dir = 4
},
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
filter_type = "freon";
filter_type = /datum/gas/freon;
name = "gas filter (freon)"
},
/turf/open/floor/engine,
@@ -82879,7 +82879,7 @@
dir = 4
},
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
filter_type = "n2"
filter_type = /datum/gas/nitrogen
},
/turf/open/floor/engine,
/area/engine/engineering)
@@ -11009,7 +11009,7 @@
"asz" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 2;
filter_type = "n2";
filter_type = /datum/gas/nitrogen;
name = "nitrogen filter";
on = 1
},
@@ -13296,7 +13296,7 @@
"awD" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 2;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
name = "oxygen filter";
on = 1
},
@@ -14109,7 +14109,7 @@
"ayf" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "plasma";
filter_type = /datum/gas/plasma;
name = "waste filter";
on = 1
},
@@ -21607,7 +21607,7 @@
},
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
dir = 1;
filter_type = "n2"
filter_type = /datum/gas/nitrogen
},
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -23873,7 +23873,7 @@
},
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
dir = 1;
filter_type = "freon";
filter_type = /datum/gas/freon;
name = "gas filter (freon)"
},
/turf/open/floor/plasteel,
@@ -32785,7 +32785,6 @@
/obj/item/hand_labeler,
/obj/item/device/radio/headset/headset_med,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bwW" = (
@@ -41751,6 +41750,7 @@
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
/obj/item/circuitboard/machine/smoke_machine,
/turf/open/floor/plasteel/darkgreen,
/area/storage/tech)
"bQw" = (
@@ -41924,7 +41924,7 @@
"bQN" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "n2o";
filter_type = /datum/gas/nitrous_oxide;
on = 1
},
/turf/open/floor/plasteel,
@@ -43351,7 +43351,7 @@
"bTU" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "plasma";
filter_type = /datum/gas/plasma;
on = 1
},
/turf/open/floor/plasteel,
@@ -44738,7 +44738,7 @@
"bWK" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4;
filter_type = "o2";
filter_type = /datum/gas/oxygen;
on = 1
},
/turf/open/floor/plasteel,
@@ -44777,7 +44777,7 @@
"bWQ" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
filter_type = "co2";
filter_type = /datum/gas/carbon_dioxide;
on = 1
},
/turf/open/floor/plasteel,
+1
View File
@@ -17,6 +17,7 @@
#define META_GAS_MOLES_VISIBLE 3
#define META_GAS_OVERLAY 4
#define META_GAS_DANGER 5
#define META_GAS_ID 6
//stuff you should probably leave well alone!
//ATMOS
+3
View File
@@ -466,3 +466,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
//Dummy mob reserve slots
#define DUMMY_HUMAN_SLOT_PREFERENCES "dummy_preference_preview"
#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation"
#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
//This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
+76 -75
View File
@@ -1,75 +1,76 @@
#define DEBUG //Enables byond profiling and full runtime logs - note, this may also be defined in your .dme file
//Enables in-depth debug messages to runtime log (used for debugging)
//#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this
//uncommented, but not visible in the release version)
#ifdef TESTING
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
//Also allows for recursive reference searching of datums.
//Sets world.loop_checks to false and prevents find references from sleeping
//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green
#endif
#define PRELOAD_RSC 1 /*set to:
0 to allow using external resources or on-demand behaviour;
1 to use the default behaviour;
2 for preloading absolutely everything;
*/
#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary.
// 1 will enable set background. 0 will disable set background.
//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 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
//MINOR TWEAKS/MISC
#define AGE_MIN 18 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
#define WIZARD_AGE_MIN 30 //youngest a wizard can be
#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up
#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases
#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default.
#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism
#define MAX_STACK_AMOUNT_METAL 50
#define MAX_STACK_AMOUNT_GLASS 50
#define MAX_STACK_AMOUNT_RODS 60
// AI Toggles
#define AI_CAMERA_LUMINOSITY 5
#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_1.
#ifdef TESTING
#warn compiling in TESTING mode. testing() debug messages will be visible.
#endif
#ifdef TRAVISTESTING
#define TESTING
#endif
//Update this whenever you need to take advantage of more recent byond features
#define MIN_COMPILER_VERSION 511
#if DM_VERSION < MIN_COMPILER_VERSION
//Don't forget to update this part
#error Your version of BYOND is too out-of-date to compile this project. Go to byond.com/download and update.
#error You need version 511 or higher
#endif
//Update this whenever the db schema changes
//make sure you add an update to the schema_version stable in the db changelog
#define DB_MAJOR_VERSION 3
#define DB_MINOR_VERSION 3
#define DEBUG //Enables byond profiling and full runtime logs - note, this may also be defined in your .dme file
//Enables in-depth debug messages to runtime log (used for debugging)
//#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this
//uncommented, but not visible in the release version)
#ifdef TESTING
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
//Also allows for recursive reference searching of datums.
//Sets world.loop_checks to false and prevents find references from sleeping
//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green
#endif
#define PRELOAD_RSC 1 /*set to:
0 to allow using external resources or on-demand behaviour;
1 to use the default behaviour;
2 for preloading absolutely everything;
*/
#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary.
// 1 will enable set background. 0 will disable set background.
//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 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
//MINOR TWEAKS/MISC
#define AGE_MIN 17 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
#define WIZARD_AGE_MIN 30 //youngest a wizard can be
#define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be
#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up
#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases
#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default.
#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism
#define MAX_STACK_AMOUNT_METAL 50
#define MAX_STACK_AMOUNT_GLASS 50
#define MAX_STACK_AMOUNT_RODS 60
// AI Toggles
#define AI_CAMERA_LUMINOSITY 5
#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.
#ifdef TESTING
#warn compiling in TESTING mode. testing() debug messages will be visible.
#endif
#ifdef TRAVISTESTING
#define TESTING
#endif
//Update this whenever you need to take advantage of more recent byond features
#define MIN_COMPILER_VERSION 511
#if DM_VERSION < MIN_COMPILER_VERSION
//Don't forget to update this part
#error Your version of BYOND is too out-of-date to compile this project. Go to byond.com/download and update.
#error You need version 511 or higher
#endif
//Update this whenever the db schema changes
//make sure you add an update to the schema_version stable in the db changelog
#define DB_MAJOR_VERSION 3
#define DB_MINOR_VERSION 4
+2
View File
@@ -16,6 +16,8 @@ GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt"))
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt"))
GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt"))
GLOBAL_LIST_INIT(megacarp_last_names, world.file2list("strings/names/megacarp2.txt"))
GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt"))
+2 -12
View File
@@ -1,6 +1,6 @@
/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
for(var/datum/mind/crewMind in SSticker.minds)
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
if(prob(5) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
generate_miscreant_objectives(crewMind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
@@ -16,7 +16,7 @@
return
if(!crewMind.assigned_role)
return
var/list/validobjs = get_valid_crew_objs(ckey(crewMind.assigned_role))
var/list/validobjs = crewobjjobs["[ckey(crewMind.assigned_role)]"]
if(!validobjs || !validobjs.len)
return
var/selectedObj = pick(validobjs)
@@ -28,16 +28,6 @@
to_chat(crewMind, "<B>As a part of Nanotrasen's anti-tide efforts, you have been assigned an optional objective. It will be checked at the end of the shift. <font color=red>Performing traitorous acts in pursuit of your objective may result in termination of your employment.</font></B>")
to_chat(crewMind, "<B>Your optional objective:</B> [newObjective.explanation_text]")
/datum/controller/subsystem/ticker/proc/get_valid_crew_objs(var/job = "")//taken from old hippie with adjustments
var/list/objpaths = typesof(/datum/objective/crew)
var/list/objlist = list()
for(var/hoorayhackyshit in objpaths)
var/datum/objective/crew/obj = hoorayhackyshit //dm is not a sane language in any way, shape, or form.
var/list/availableto = splittext(initial(obj.jobs),",")
if(job in availableto)
objlist += obj
return objlist
/datum/objective/crew/
var/jobs = ""
explanation_text = "Yell on the development discussion channel on Citadels discord if this ever shows up. Something just broke here, dude"
+1 -1
View File
@@ -11,7 +11,7 @@
return
if(jobban_isbanned(crewMind, "Syndicate"))
return
var/list/objectiveTypes = typesof(/datum/objective/miscreant) - /datum/objective/miscreant
var/list/objectiveTypes = miscreantobjlist
if(!objectiveTypes.len)
return
var/selectedType = pick(objectiveTypes)
@@ -16,6 +16,8 @@ SUBSYSTEM_DEF(server_maint)
/datum/controller/subsystem/server_maint/fire(resumed = FALSE)
if(!resumed)
if(listclearnulls(GLOB.clients))
log_world("Found a null in clients list!")
src.currentrun = GLOB.clients.Copy()
var/list/currentrun = src.currentrun
+1 -1
View File
@@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui)
var/basehtml // The HTML base used for all UIs.
/datum/controller/subsystem/tgui/PreInit()
basehtml = file2text('tgui/tgui.html') // Read the HTML from disk.
basehtml = file2text("tgui/tgui.html")
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
+17 -4
View File
@@ -66,6 +66,11 @@ SUBSYSTEM_DEF(ticker)
var/modevoted = FALSE //Have we sent a vote for the gamemode?
//Crew Objective/Miscreant stuff
var/list/crewobjlist = list()
var/list/crewobjjobs = list()
var/list/miscreantobjlist = list()
/datum/controller/subsystem/ticker/Initialize(timeofday)
load_mode()
@@ -87,7 +92,7 @@ SUBSYSTEM_DEF(ticker)
var/list/provisional_title_music = flist("config/title_music/sounds/")
var/list/music = list()
var/use_rare_music = prob(1)
for(var/S in provisional_title_music)
var/lower = lowertext(S)
var/list/L = splittext(lower,"+")
@@ -115,7 +120,7 @@ SUBSYSTEM_DEF(ticker)
if(byond_sound_formats[ext])
continue
music -= S
if(isemptylist(music))
music = world.file2list(ROUND_START_MUSIC_LIST, "\n")
login_music = pick(music)
@@ -123,6 +128,14 @@ SUBSYSTEM_DEF(ticker)
login_music = "config/title_music/sounds/[pick(music)]"
crewobjlist = typesof(/datum/objective/crew)
miscreantobjlist = (typesof(/datum/objective/miscreant) - /datum/objective/miscreant)
for(var/hoorayhackyshit in crewobjlist) //taken from old Hippie's "job2obj" proc with adjustments.
var/datum/objective/crew/obj = hoorayhackyshit //dm is not a sane language in any way, shape, or form.
var/list/availableto = splittext(initial(obj.jobs),",")
for(var/job in availableto)
crewobjjobs["[job]"] += list(obj)
if(!GLOB.syndicate_code_phrase)
GLOB.syndicate_code_phrase = generate_code_phrase()
if(!GLOB.syndicate_code_response)
@@ -521,11 +534,11 @@ SUBSYSTEM_DEF(ticker)
if(!crewMind.current || !crewMind.objectives.len)
continue
for(var/datum/objective/miscreant/MO in crewMind.objectives)
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [MO.explanation_text] <font color='grey'>(Optional)</font><BR>"
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [MO.explanation_text] <font color='grey'>(Optional)</font>"
for(var/datum/objective/crew/CO in crewMind.objectives)
if(CO.check_completion())
to_chat(crewMind.current, "<br><B>Your optional objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font><BR>"
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font>"
else
to_chat(crewMind.current, "<br><B>Your optional objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
+5 -4
View File
@@ -1,20 +1,21 @@
GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist
var/name = "Antagonist"
var/datum/mind/owner //Mind that owns this datum
var/silent = FALSE //Silent will prevent the gain/lose texts to show
var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum
var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with
var/delete_on_death = TRUE
var/delete_on_mind_deletion = TRUE
/datum/antagonist/New(datum/mind/new_owner)
GLOB.antagonists += src
typecache_datum_blacklist = typecacheof(typecache_datum_blacklist)
if(new_owner)
owner = new_owner
/datum/antagonist/Destroy()
GLOB.antagonists -= src
if(owner)
LAZYREMOVE(owner.antag_datums, src)
owner = null
+1 -1
View File
@@ -131,7 +131,7 @@
/datum/antagonist/cult/master/on_gain()
. = ..()
var/mob/living/current = owner.current
SSticker.mode.set_antag_hud(current, "cultmaster")
set_antag_hud(current, "cultmaster")
/datum/antagonist/cult/master/greet()
to_chat(owner.current, "<span class='cultlarge'>You are the cult's Master</span>. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \
+1 -1
View File
@@ -86,7 +86,7 @@ GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon",
GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr."))
/datum/antagonist/devil
//Don't delete upon mind destruction, otherwise soul re-selling will break.
delete_on_death = FALSE
delete_on_mind_deletion = FALSE
var/obligation
var/ban
var/bane
+273
View File
@@ -0,0 +1,273 @@
#define APPRENTICE_DESTRUCTION "destruction"
#define APPRENTICE_BLUESPACE "bluespace"
#define APPRENTICE_ROBELESS "robeless"
#define APPRENTICE_HEALING "healing"
/datum/antagonist/wizard
name = "Space Wizard"
var/give_objectives = TRUE
var/strip = TRUE //strip before equipping
var/allow_rename = TRUE
var/hud_version = "wizard"
var/datum/objective_team/wizard/wiz_team //Only created if wizard summons apprentices
var/list/objectives = list() //this should be base datum antag proc and list, todo make lazy
var/move_to_lair = TRUE
var/outfit_type = /datum/outfit/wizard
var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */
/datum/antagonist/wizard/on_gain()
register()
if(give_objectives)
create_objectives()
equip_wizard()
if(move_to_lair)
send_to_lair()
. = ..()
if(allow_rename)
rename_wizard()
/datum/antagonist/wizard/proc/register()
SSticker.mode.wizards |= owner
/datum/antagonist/wizard/proc/unregister()
SSticker.mode.wizards -= src
/datum/objective_team/wizard
name = "wizard team"
/datum/antagonist/wizard/proc/create_wiz_team()
wiz_team = new(owner)
wiz_team.name = "[owner.current.real_name] team"
update_wiz_icons_added(owner.current)
/datum/antagonist/wizard/proc/send_to_lair()
if(!owner || !owner.current)
return
if(!GLOB.wizardstart.len)
SSjob.SendToLateJoin(owner.current)
to_chat(owner, "HOT INSERTION, GO GO GO")
owner.current.forceMove(pick(GLOB.wizardstart))
/datum/antagonist/wizard/proc/create_objectives()
switch(rand(1,100))
if(1 to 30)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = owner
kill_objective.find_target()
objectives += kill_objective
if (!(locate(/datum/objective/escape) in owner.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = owner
objectives += escape_objective
if(31 to 60)
var/datum/objective/steal/steal_objective = new
steal_objective.owner = owner
steal_objective.find_target()
objectives += steal_objective
if (!(locate(/datum/objective/escape) in owner.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = owner
objectives += escape_objective
if(61 to 85)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = owner
kill_objective.find_target()
objectives += kill_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = owner
steal_objective.find_target()
objectives += steal_objective
if (!(locate(/datum/objective/survive) in owner.objectives))
var/datum/objective/survive/survive_objective = new
survive_objective.owner = owner
objectives += survive_objective
else
if (!(locate(/datum/objective/hijack) in owner.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = owner
objectives += hijack_objective
for(var/datum/objective/O in objectives)
owner.objectives += O
/datum/antagonist/wizard/on_removal()
unregister()
owner.RemoveAllSpells() // TODO keep track which spells are wizard spells which innate stuff
return ..()
/datum/antagonist/wizard/proc/equip_wizard()
if(!owner)
return
var/mob/living/carbon/human/H = owner.current
if(!istype(H))
return
if(strip)
H.delete_equipment()
//Wizards are human by default. Use the mirror if you want something else.
H.set_species(/datum/species/human)
if(H.age < wiz_age)
H.age = wiz_age
H.equipOutfit(outfit_type)
/datum/antagonist/wizard/greet()
to_chat(owner, "<span class='boldannounce'>You are the Space Wizard!</span>")
to_chat(owner, "<B>The Space Wizards Federation has given you the following tasks:</B>")
owner.announce_objectives()
to_chat(owner, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(owner, "The spellbook is bound to you, and others cannot use it.")
to_chat(owner, "In your pockets you will find a teleport scroll. Use it as needed.")
to_chat(owner,"<B>Remember:</B> do not forget to prepare your spells.")
/datum/antagonist/wizard/farewell()
to_chat(owner, "<span class='userdanger'>You have been brainwashed! You are no longer a wizard!</span>")
/datum/antagonist/wizard/proc/rename_wizard()
set waitfor = FALSE
var/wizard_name_first = pick(GLOB.wizard_first)
var/wizard_name_second = pick(GLOB.wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
var/mob/living/wiz_mob = owner.current
var/newname = copytext(sanitize(input(wiz_mob, "You are the [name]. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = randomname
wiz_mob.fully_replace_character_name(wiz_mob.real_name, newname)
/datum/antagonist/wizard/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
if(wiz_team) //Don't bother with the icon if you're solo wizard
update_wiz_icons_added(M)
M.faction |= "wizard"
/datum/antagonist/wizard/remove_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
update_wiz_icons_removed(M)
M.faction -= "wizard"
/datum/antagonist/wizard/apprentice
name = "Wizard Apprentice"
hud_version = "apprentice"
var/datum/mind/master
var/school = APPRENTICE_DESTRUCTION
outfit_type = /datum/outfit/wizard/apprentice
wiz_age = APPRENTICE_AGE_MIN
/datum/antagonist/wizard/apprentice/greet()
to_chat(owner, "<B>You are [master.current.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
owner.announce_objectives()
/datum/antagonist/wizard/apprentice/register()
SSticker.mode.apprentices |= src
/datum/antagonist/wizard/apprentice/unregister()
SSticker.mode.apprentices -= src
/datum/antagonist/wizard/apprentice/equip_wizard()
. = ..()
if(!owner)
return
var/mob/living/carbon/human/H = owner.current
if(!istype(H))
return
switch(school)
if(APPRENTICE_DESTRUCTION)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if(APPRENTICE_BLUESPACE)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if(APPRENTICE_HEALING)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
H.put_in_hands(new /obj/item/gun/magic/staff/healing(H))
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if(APPRENTICE_HEALING)
owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
/datum/antagonist/wizard/apprentice/create_objectives()
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = owner
new_objective.target = master
new_objective.explanation_text = "Protect [master.current.real_name], the wizard."
owner.objectives += new_objective
objectives += new_objective
//Random event wizard
/datum/antagonist/wizard/apprentice/imposter
name = "Wizard Imposter"
allow_rename = FALSE
/datum/antagonist/wizard/apprentice/imposter/greet()
to_chat(owner, "<B>You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!</B>")
owner.announce_objectives()
/datum/antagonist/wizard/apprentice/imposter/equip_wizard()
var/mob/living/carbon/human/master_mob = master.current
var/mob/living/carbon/human/H = owner.current
if(!istype(master_mob) || !istype(H))
return
if(master_mob.ears)
H.equip_to_slot_or_del(new master_mob.ears.type, slot_ears)
if(master_mob.w_uniform)
H.equip_to_slot_or_del(new master_mob.w_uniform.type, slot_w_uniform)
if(master_mob.shoes)
H.equip_to_slot_or_del(new master_mob.shoes.type, slot_shoes)
if(master_mob.wear_suit)
H.equip_to_slot_or_del(new master_mob.wear_suit.type, slot_wear_suit)
if(master_mob.head)
H.equip_to_slot_or_del(new master_mob.head.type, slot_head)
if(master_mob.back)
H.equip_to_slot_or_del(new master_mob.back.type, slot_back)
//Operation: Fuck off and scare people
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
/datum/antagonist/wizard/proc/update_wiz_icons_added(mob/living/wiz)
var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
wizhud.join_hud(wiz)
set_antag_hud(wiz, hud_version)
/datum/antagonist/wizard/proc/update_wiz_icons_removed(mob/living/wiz)
var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
wizhud.leave_hud(wiz)
set_antag_hud(wiz, null)
/datum/antagonist/wizard/academy
name = "Academy Teacher"
outfit_type = /datum/outfit/wizard/academy
/datum/antagonist/wizard/academy/equip_wizard()
. = ..()
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball)
var/mob/living/M = owner.current
if(!istype(M))
return
var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M)
Implant.implant(M)
/datum/antagonist/wizard/academy/create_objectives()
var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders")
new_objective.owner = owner
owner.objectives += new_objective
objectives += new_objective
+3 -3
View File
@@ -191,11 +191,11 @@
// Can most things breathe?
if(trace_gases)
continue
if(!(A_gases["o2"] && A_gases["o2"][MOLES] >= 16))
if(!(A_gases[/datum/gas/oxygen] && A_gases[/datum/gas/oxygen][MOLES] >= 16))
continue
if(A_gases["plasma"])
if(A_gases[/datum/gas/plasma])
continue
if(A_gases["co2"] && A_gases["co2"][MOLES] >= 10)
if(A_gases[/datum/gas/carbon_dioxide] && A_gases[/datum/gas/carbon_dioxide][MOLES] >= 10)
continue
// Aim for goldilocks temperatures and pressure
+2
View File
@@ -112,6 +112,8 @@
D.stop_pulling()
if(A.a_intent == INTENT_GRAB)
add_logs(A, D, "grabbed", addition="aggressively")
D.visible_message("<span class='warning'>[A] violently grabs [D]!</span>", \
"<span class='userdanger'>[A] violently grabs you!</span>")
A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
else
add_logs(A, D, "grabbed", addition="passively")
+19 -41
View File
@@ -75,7 +75,7 @@
if(islist(antag_datums))
for(var/i in antag_datums)
var/datum/antagonist/antag_datum = i
if(antag_datum.delete_on_death)
if(antag_datum.delete_on_mind_deletion)
qdel(i)
antag_datums = null
return ..()
@@ -133,10 +133,16 @@
memory = null
// Datum antag mind procs
/datum/mind/proc/add_antag_datum(datum_type, team)
if(!datum_type)
/datum/mind/proc/add_antag_datum(datum_type_or_instance, team)
if(!datum_type_or_instance)
return
var/datum/antagonist/A = new datum_type(src, team)
var/datum/antagonist/A
if(!ispath(datum_type_or_instance))
A = datum_type_or_instance
if(!istype(A))
return
else
A = new datum_type_or_instance(src, team)
if(!A.can_be_owned(src))
qdel(A)
return
@@ -193,12 +199,12 @@
/datum/mind/proc/remove_traitor()
if(src in SSticker.mode.traitors)
src.remove_antag_datum(ANTAG_DATUM_TRAITOR)
remove_antag_datum(ANTAG_DATUM_TRAITOR)
SSticker.mode.update_traitor_icons_removed(src)
/datum/mind/proc/remove_brother()
if(src in SSticker.mode.brothers)
src.remove_antag_datum(ANTAG_DATUM_BROTHER)
remove_antag_datum(ANTAG_DATUM_BROTHER)
SSticker.mode.update_brother_icons_removed(src)
/datum/mind/proc/remove_nukeop()
@@ -210,11 +216,8 @@
remove_antag_equip()
/datum/mind/proc/remove_wizard()
if(src in SSticker.mode.wizards)
SSticker.mode.wizards -= src
RemoveAllSpells()
remove_antag_datum(/datum/antagonist/wizard)
special_role = null
remove_antag_equip()
/datum/mind/proc/remove_cultist()
if(src in SSticker.mode.cult)
@@ -254,7 +257,6 @@
remove_rev()
SSticker.mode.update_changeling_icons_removed(src)
SSticker.mode.update_traitor_icons_removed(src)
SSticker.mode.update_wiz_icons_removed(src)
SSticker.mode.update_cult_icons_removed(src)
SSticker.mode.update_rev_icons_removed(src)
@@ -526,11 +528,9 @@
if (SSticker.mode.config_tag=="wizard")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if ((src in SSticker.mode.wizards) || (src in SSticker.mode.apprentices))
if (has_antag_datum(/datum/antagonist/wizard))
text += "<b>YES</b> | <a href='?src=\ref[src];wizard=clear'>no</a>"
text += "<br><a href='?src=\ref[src];wizard=lair'>To lair</a>, <a href='?src=\ref[src];common=undress'>undress</a>, <a href='?src=\ref[src];wizard=dressup'>dress up</a>, <a href='?src=\ref[src];wizard=name'>let choose name</a>."
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];wizard=autoobjectives'>Randomize!</a>"
text += "<br><a href='?src=\ref[src];wizard=lair'>To lair</a>, <a href='?src=\ref[src];common=undress'>undress</a>"
else
text += "<a href='?src=\ref[src];wizard=wizard'>yes</a> | <b>NO</b>"
@@ -1049,27 +1049,15 @@
switch(href_list["wizard"])
if("clear")
remove_wizard()
to_chat(current, "<span class='userdanger'>You have been brainwashed! You are no longer a wizard!</span>")
log_admin("[key_name(usr)] has de-wizard'ed [current].")
SSticker.mode.update_wiz_icons_removed(src)
if("wizard")
if(!(src in SSticker.mode.wizards))
SSticker.mode.wizards += src
if(has_antag_datum(/datum/antagonist/wizard))
special_role = "Wizard"
//SSticker.mode.learn_basic_spells(current)
to_chat(current, "<span class='boldannounce'>You are the Space Wizard!</span>")
add_antag_datum(/datum/antagonist/wizard)
message_admins("[key_name_admin(usr)] has wizard'ed [current].")
log_admin("[key_name(usr)] has wizard'ed [current].")
SSticker.mode.update_wiz_icons_added(src)
if("lair")
current.forceMove(pick(GLOB.wizardstart))
if("dressup")
SSticker.mode.equip_wizard(current)
if("name")
SSticker.mode.name_wizard(current)
if("autoobjectives")
SSticker.mode.forge_wizard_objectives(src)
to_chat(usr, "<span class='notice'>The objectives for wizard [key] have been generated. You can edit them and anounce manually.</span>")
else if (href_list["changeling"])
switch(href_list["changeling"])
@@ -1440,20 +1428,10 @@
SSticker.mode.update_changeling_icons_added(src)
/datum/mind/proc/make_Wizard()
if(!(src in SSticker.mode.wizards))
SSticker.mode.wizards += src
if(!has_antag_datum(/datum/antagonist/wizard))
special_role = "Wizard"
assigned_role = "Wizard"
if(!GLOB.wizardstart.len)
SSjob.SendToLateJoin(current)
to_chat(current, "HOT INSERTION, GO GO GO")
else
current.forceMove(pick(GLOB.wizardstart))
SSticker.mode.equip_wizard(current)
SSticker.mode.name_wizard(current)
SSticker.mode.forge_wizard_objectives(src)
SSticker.mode.greet_wizard(src)
add_antag_datum(/datum/antagonist/wizard)
/datum/mind/proc/make_Cultist()
+168
View File
@@ -0,0 +1,168 @@
// SETUP
/proc/TopicHandlers()
. = list()
var/list/all_handlers = subtypesof(/datum/world_topic)
for(var/I in all_handlers)
var/datum/world_topic/WT = I
var/keyword = initial(WT.keyword)
if(!keyword)
warning("[WT] has no keyword! Ignoring...")
continue
var/existing_path = .[keyword]
if(existing_path)
warning("[existing_path] and [WT] have the same keyword! Ignoring [WT]...")
else if(keyword == "key")
warning("[WT] has keyword 'key'! Ignoring...")
else
.[keyword] = WT
// DATUM
/datum/world_topic
var/keyword
var/log = TRUE
var/key_valid
var/require_comms_key = FALSE
/datum/world_topic/proc/TryRun(list/input)
key_valid = !config || CONFIG_GET(string/comms_key) != input["key"]
if(require_comms_key && !key_valid)
return "Bad Key"
input -= "key"
. = Run(input)
if(islist(.))
. = list2params(.)
/datum/world_topic/proc/Run(list/input)
CRASH("Run() not implemented for [type]!")
// TOPICS
/datum/world_topic/ping
keyword = "ping"
log = FALSE
/datum/world_topic/ping/Run(list/input)
. = 0
for (var/client/C in GLOB.clients)
++.
/datum/world_topic/playing
keyword = "playing"
log = FALSE
/datum/world_topic/playing/Run(list/input)
return GLOB.player_list.len
/datum/world_topic/pr_announce
keyword = "announce"
require_comms_key = TRUE
var/static/list/PRcounts = list() //PR id -> number of times announced this round
/datum/world_topic/pr_announce/Run(list/input)
var/list/payload = json_decode(input["payload"])
var/id = "[payload["pull_request"]["id"]]"
if(!PRcounts[id])
PRcounts[id] = 1
else
++PRcounts[id]
if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
return
var/final_composed = "<span class='announce'>PR: [input[keyword]]</span>"
for(var/client/C in GLOB.clients)
C.AnnouncePR(final_composed)
/datum/world_topic/ahelp_relay
keyword = "ahelp_relay"
require_comms_key = TRUE
/datum/world_topic/ahelp_relay/Run(list/input)
relay_msg_admins("<span class='adminnotice'><b><font color=red>HELP: </font> [input["source"]] [input["message_sender"]]: [input["message"]]</b></span>")
/datum/world_topic/comms_console
keyword = "comms_console"
require_comms_key = TRUE
/datum/world_topic/comms_console/Run(list/input)
minor_announce(input["message"], "Incoming message from [input["message_sender"]]")
for(var/obj/machinery/computer/communications/CM in GLOB.machines)
CM.overrideCooldown()
/datum/world_topic/news_report
keyword = "news_report"
require_comms_key = TRUE
/datum/world_topic/news_report/Run(list/input)
minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
/datum/world_topic/server_hop
keyword = "server_hop"
/datum/world_topic/server_hop/Run(list/input)
var/expected_key = input[keyword]
for(var/mob/dead/observer/O in GLOB.player_list)
if(O.key == expected_key)
if(O.client)
new /obj/screen/splash(O.client, TRUE)
break
/datum/world_topic/adminmsg
keyword = "adminmsg"
/datum/world_topic/adminmsg/Run(list/input)
return IrcPm(input[keyword], input["msg"], input["sender"])
/datum/world_topic/namecheck
keyword = "namecheck"
/datum/world_topic/namecheck/Run(list/input)
var/datum/server_tools_command/namecheck/NC = new
return NC.Run(input["sender"], input["namecheck"])
/datum/world_topic/adminwho
keyword = "namecheck"
/datum/world_topic/adminwho/Run(list/input)
return ircadminwho()
/datum/world_topic/status
keyword = "status"
/datum/world_topic/status/Run(list/input)
. = list()
.["version"] = GLOB.game_version
.["mode"] = GLOB.master_mode
.["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE
.["enter"] = GLOB.enter_allowed
.["vote"] = CONFIG_GET(flag/allow_vote_mode)
.["ai"] = CONFIG_GET(flag/allow_ai)
.["host"] = world.host ? world.host : null
.["players"] = GLOB.clients.len
.["revision"] = GLOB.revdata.commit
.["revision_date"] = GLOB.revdata.date
var/list/adm = get_admin_counts()
var/list/presentmins = adm["present"]
var/list/afkmins = adm["afk"]
.["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
.["gamestate"] = SSticker.current_state
.["map_name"] = SSmapping.config.map_name
if(key_valid)
.["active_players"] = get_active_player_count()
if(SSticker.HasRoundStarted())
.["real_mode"] = SSticker.mode.name
// Key-authed callers may know the truth behind the "secret"
.["security_level"] = get_security_level()
.["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
// Amount of world's ticks in seconds, useful for calculating round duration
if(SSshuttle && SSshuttle.emergency)
.["shuttle_mode"] = SSshuttle.emergency.mode
// Shuttle status, see /__DEFINES/stat.dm
.["shuttle_timer"] = SSshuttle.emergency.timeLeft()
// Shuttle timer, in seconds
+2 -2
View File
@@ -29,7 +29,7 @@
//GAME_MODE PROCS
//called to set a mob's antag icon state
/datum/game_mode/proc/set_antag_hud(mob/M, new_icon_state)
/proc/set_antag_hud(mob/M, new_icon_state)
if(!istype(M))
CRASH("set_antag_hud(): [M] ([M.type]) is not a mob!")
var/image/holder = M.hud_list[ANTAG_HUD]
@@ -43,7 +43,7 @@
//these are called by mind.transfer_to()
/datum/mind/proc/transfer_antag_huds(datum/atom_hud/antag/newhud)
leave_all_antag_huds()
SSticker.mode.set_antag_hud(current, antag_hud_icon_state)
set_antag_hud(current, antag_hud_icon_state)
if(newhud)
newhud.join_hud(current)
+20 -62
View File
@@ -29,13 +29,13 @@
dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>"
dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>"
dat += "<B>Which school of magic is your apprentice studying?:</B><BR>"
dat += "<A href='byond://?src=\ref[src];school=destruction'>Destruction</A><BR>"
dat += "<A href='byond://?src=\ref[src];school=[APPRENTICE_DESTRUCTION]'>Destruction</A><BR>"
dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=bluespace'>Bluespace Manipulation</A><BR>"
dat += "<A href='byond://?src=\ref[src];school=[APPRENTICE_BLUESPACE]'>Bluespace Manipulation</A><BR>"
dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=healing'>Healing</A><BR>"
dat += "<A href='byond://?src=\ref[src];school=[APPRENTICE_HEALING]'>Healing</A><BR>"
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=robeless'>Robeless</A><BR>"
dat += "<A href='byond://?src=\ref[src];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
@@ -63,73 +63,31 @@
return
used = 1
var/mob/dead/observer/theghost = pick(candidates)
spawn_antag(theghost.client, get_turf(src), href_list["school"])
if(H && H.mind)
SSticker.mode.update_wiz_icons_added(H.mind)
spawn_antag(theghost.client, get_turf(src), href_list["school"],H.mind)
else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, school,datum/mind/wizard)
new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/wizard_name = "the wizard"
if(usr)
wizard_name = usr.real_name
to_chat(M, "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
switch(type)
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if("bluespace")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if("healing")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
M.put_in_hands(new /obj/item/gun/magic/staff/healing(M), TRUE)
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if("robeless")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
equip_antag(M)
var/wizard_name_first = pick(GLOB.wizard_first)
var/wizard_name_second = pick(GLOB.wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
if(usr)
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = M.mind
new_objective.target = usr.mind
new_objective.explanation_text = "Protect [usr.real_name], the wizard."
M.mind.objectives += new_objective
SSticker.mode.apprentices += M.mind
M.mind.assigned_role = "Apprentice"
M.mind.special_role = "apprentice"
SSticker.mode.update_wiz_icons_added(M.mind)
var/datum/mind/app_mind = M.mind
var/datum/antagonist/wizard/master_antag = wizard.has_antag_datum(/datum/antagonist/wizard)
if(!master_antag.wiz_team)
master_antag.create_wiz_team()
var/datum/antagonist/wizard/apprentice/app = new(app_mind)
app.wiz_team = master_antag.wiz_team
app.master = wizard
app.school = school
master_antag.wiz_team.members += app_mind
app_mind.add_antag_datum(app)
//TODO Kill these if possible
app_mind.assigned_role = "Apprentice"
app_mind.special_role = "apprentice"
//
SEND_SOUND(M, sound('sound/effects/magic.ogg'))
var/newname = copytext(sanitize(input(M, "You are [wizard_name]'s apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = randomname
M.mind.name = newname
M.real_name = newname
M.name = newname
M.age = rand(AGE_MIN, WIZARD_AGE_MIN - 1)
M.dna.update_dna_identity()
/obj/item/antag_spawner/contract/equip_antag(mob/target)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
target.equip_to_slot_or_del(new /obj/item/storage/backpack(target), slot_back)
target.equip_to_slot_or_del(new /obj/item/storage/box(target), slot_in_backpack)
target.equip_to_slot_or_del(new /obj/item/teleportation_scroll/apprentice(target), slot_r_store)
///////////BORGS AND OPERATIVES
@@ -146,6 +146,8 @@ Credit where due:
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar //that's a mouthful
G.initial_activation_delay = ark_time * 60
G.seconds_until_activation = ark_time * 60 //60 seconds in a minute * number of minutes
for(var/obj/item/clockwork/construct_chassis/cogscarab/C in GLOB.all_clockwork_objects)
C.infinite_resources = FALSE
SSshuttle.registerHostileEnvironment(GLOB.ark_of_the_clockwork_justiciar)
..()
return 1
@@ -34,17 +34,28 @@
. = ..()
/obj/item/clockwork/construct_chassis/attack_ghost(mob/user)
if(!SSticker.mode)
to_chat(user, "<span class='danger'>You cannot use that before the game has started.</span>")
return
if(alert(user, "Become a [construct_name]? You can no longer be cloned!", construct_name, "Yes", "Cancel") == "Cancel")
return
if(QDELETED(src))
to_chat(user, "<span class='danger'>You were too late! Better luck next time.</span>")
return
pre_spawn()
visible_message(creation_message)
var/mob/living/construct = new construct_type(get_turf(src))
construct.key = user.key
post_spawn(construct)
qdel(user)
qdel(src)
/obj/item/clockwork/construct_chassis/proc/pre_spawn() //Some things might change before the construct spawns; override those on a subtype basis in this proc
return
/obj/item/clockwork/construct_chassis/proc/post_spawn(mob/living/construct) //And some things might change after it
return
//Marauder armor, used to create clockwork marauders - sturdy frontline combatants that can deflect projectiles.
/obj/item/clockwork/construct_chassis/clockwork_marauder
@@ -67,3 +78,21 @@
creation_message = "<span class='alloy bold'>The cogscarab clicks and whirrs as it hops up and springs to life!</span>"
construct_type = /mob/living/simple_animal/drone/cogscarab
w_class = WEIGHT_CLASS_SMALL
var/infinite_resources = TRUE
/obj/item/clockwork/construct_chassis/cogscarab/Initialize()
. = ..()
if(istype(SSticker.mode, /datum/game_mode/clockwork_cult))
infinite_resources = FALSE //For any that are somehow spawned in late
/obj/item/clockwork/construct_chassis/cogscarab/pre_spawn()
if(infinite_resources)
construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar //During rounds where they can't interact with the station, let them experiment with builds
/obj/item/clockwork/construct_chassis/cogscarab/post_spawn(mob/living/construct)
if(infinite_resources) //Allow them to build stuff and recite scripture
var/list/cached_stuff = construct.GetAllContents()
for(var/obj/item/clockwork/replica_fabricator/F in cached_stuff)
F.uses_power = FALSE
for(var/obj/item/clockwork/slab/S in cached_stuff)
S.no_cost = TRUE
@@ -52,6 +52,7 @@
to_chat(carrier.current, "<b>Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.</b>")
to_chat(carrier.current, "<b>While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.</b>")
to_chat(carrier.current, "<b>Your mission will be deemed a success if any of the live infected monkeys reach CentCom.</b>")
carrier.current.playsound_local(get_turf(carrier.current), 'sound/ambience/antag/monkey.ogg', 100, FALSE, pressure_affected = FALSE)
return
/datum/game_mode/monkey/post_setup()
+1 -1
View File
@@ -121,7 +121,7 @@
/datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T)
var/target_amount = text2num(name)
var/found_amount = 0
found_amount += T.air_contents.gases["plasma"] ? T.air_contents.gases["plasma"][MOLES] : 0
found_amount += T.air_contents.gases[/datum/gas/plasma] ? T.air_contents.gases[/datum/gas/plasma][MOLES] : 0
return found_amount>=target_amount
+1 -1
View File
@@ -737,7 +737,7 @@
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
if(knownspell.type == S.type)
if(user.mind)
if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard")
if(iswizard(user))
to_chat(user,"<span class='notice'>You're already far more versed in this spell than this flimsy how-to book can provide.</span>")
else
to_chat(user,"<span class='notice'>You've already read this one.</span>")
+4 -145
View File
@@ -16,160 +16,34 @@
announce_text = "There is a space wizard attacking the station!\n\
<span class='danger'>Wizard</span>: Accomplish your objectives and cause mayhem on the station.\n\
<span class='notice'>Crew</span>: Eliminate the wizard before they can succeed!"
var/use_huds = 0
var/finished = 0
/datum/game_mode/wizard/pre_setup()
var/datum/mind/wizard = pick(antag_candidates)
wizards += wizard
modePlayer += wizard
wizard.assigned_role = "Wizard"
wizard.special_role = "Wizard"
log_game("[wizard.key] (ckey) has been selected as a Wizard") //TODO: Move these to base antag datum
if(GLOB.wizardstart.len == 0)
to_chat(wizard.current, "<span class='boldannounce'>A starting location for you could not be found, please report this bug!</span>")
return 0
for(var/datum/mind/wiz in wizards)
wiz.current.forceMove(pick(GLOB.wizardstart))
return 1
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
log_game("[wizard.key] (ckey) has been selected as a Wizard")
equip_wizard(wizard.current)
forge_wizard_objectives(wizard)
if(use_huds)
update_wiz_icons_added(wizard)
greet_wizard(wizard)
name_wizard(wizard.current)
..()
return
wizard.add_antag_datum(/datum/antagonist/wizard)
return ..()
/datum/game_mode/wizard/generate_report()
return "A dangerous Wizards' Federation individual by the name of [pick(GLOB.wizard_first)] [pick(GLOB.wizard_second)] has recently escaped confinement from an unlisted prison facility. This \
man is a dangerous mutant with the ability to alter himself and the world around him by what he and his leaders believe to be magic. If this man attempts an attack on your station, \
his execution is highly encouraged, as is the preservation of his body for later study."
/datum/game_mode/proc/forge_wizard_objectives(datum/mind/wizard)
switch(rand(1,100))
if(1 to 30)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = wizard
kill_objective.find_target()
wizard.objectives += kill_objective
if (!(locate(/datum/objective/escape) in wizard.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = wizard
wizard.objectives += escape_objective
if(31 to 60)
var/datum/objective/steal/steal_objective = new
steal_objective.owner = wizard
steal_objective.find_target()
wizard.objectives += steal_objective
if (!(locate(/datum/objective/escape) in wizard.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = wizard
wizard.objectives += escape_objective
if(61 to 85)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = wizard
kill_objective.find_target()
wizard.objectives += kill_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = wizard
steal_objective.find_target()
wizard.objectives += steal_objective
if (!(locate(/datum/objective/survive) in wizard.objectives))
var/datum/objective/survive/survive_objective = new
survive_objective.owner = wizard
wizard.objectives += survive_objective
else
if (!(locate(/datum/objective/hijack) in wizard.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = wizard
wizard.objectives += hijack_objective
return
/datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob)
//Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting.
var/wizard_name_first = pick(GLOB.wizard_first)
var/wizard_name_second = pick(GLOB.wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
spawn(0)
var/newname = copytext(sanitize(input(wizard_mob, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = randomname
wizard_mob.fully_replace_character_name(wizard_mob.real_name, newname)
/* Wizards by nature cannot be too young. */
if(wizard_mob.age < WIZARD_AGE_MIN)
wizard_mob.age = WIZARD_AGE_MIN
return
/datum/game_mode/proc/greet_wizard(datum/mind/wizard, you_are=1)
if (you_are)
to_chat(wizard.current, "<span class='boldannounce'>You are the Space Wizard!</span>")
to_chat(wizard.current, "<B>The Space Wizards Federation has given you the following tasks:</B>")
wizard.announce_objectives()
return
/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
if(!istype(wizard_mob) || !wizard_mob.mind)
return 0
wizard_mob.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) //Wizards get Magic Missile and Ethereal Jaunt by default
wizard_mob.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
/datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob)
if (!istype(wizard_mob))
return
//So zards properly get their items when they are admin-made.
qdel(wizard_mob.wear_suit)
qdel(wizard_mob.head)
qdel(wizard_mob.shoes)
for(var/obj/item/I in wizard_mob.held_items)
qdel(I)
qdel(wizard_mob.r_store)
qdel(wizard_mob.l_store)
wizard_mob.set_species(/datum/species/human)
wizard_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(wizard_mob), slot_ears)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(wizard_mob), slot_shoes)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack(wizard_mob), slot_back)
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/box/survival(wizard_mob), slot_in_backpack)
wizard_mob.equip_to_slot_or_del(new /obj/item/teleportation_scroll(wizard_mob), slot_r_store)
var/obj/item/spellbook/spellbook = new /obj/item/spellbook(wizard_mob)
spellbook.owner = wizard_mob
wizard_mob.put_in_hands(spellbook, TRUE)
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.")
wizard_mob.mind.store_memory("<B>Remember:</B> do not forget to prepare your spells.")
return 1
/datum/game_mode/wizard/check_finished()
for(var/datum/mind/wizard in wizards)
if(isliving(wizard.current) && wizard.current.stat!=DEAD)
return ..()
@@ -186,7 +60,6 @@
to_chat(world, "<span class='userdanger'>The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!</span>")
SSticker.news_report = WIZARD_KILLED
..()
return 1
@@ -247,20 +120,6 @@
to_chat(world, text)
return 1
//OTHER PROCS
//returns whether the mob is a wizard (or apprentice)
/proc/iswizard(mob/living/M)
return istype(M) && M.mind && SSticker && SSticker.mode && ((M.mind in SSticker.mode.wizards) || (M.mind in SSticker.mode.apprentices))
/datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind)
var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
wizhud.join_hud(wiz_mind.current)
set_antag_hud(wiz_mind.current, ((wiz_mind in wizards) ? "wizard" : "apprentice"))
/datum/game_mode/proc/update_wiz_icons_removed(datum/mind/wiz_mind)
var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
wizhud.leave_hud(wiz_mind.current)
set_antag_hud(wiz_mind.current, null)
return M.mind && M.mind.has_antag_datum(/datum/antagonist/wizard,TRUE)
-10
View File
@@ -411,16 +411,6 @@
if(..())
return
if(issilicon(usr))
if(iscyborg(usr))
var/mob/living/silicon/robot/R = usr
if(!(R.module && istype(R.module, /obj/item/robot_module/butler) ))
to_chat(usr, "<span class='notice'>The vending machine refuses to interface with you, as you are not in its target demographic!</span>")
return
else
to_chat(usr, "<span class='notice'>The vending machine refuses to interface with you, as you are not in its target demographic!</span>")
return
if(href_list["remove_coin"])
if(!(coin || bill))
to_chat(usr, "<span class='notice'>There is no money in this machine.</span>")
@@ -426,14 +426,14 @@
if(!istype(T))
return
var/datum/gas_mixture/GM = new
ASSERT_GAS("plasma", GM)
ADD_GAS(/datum/gas/plasma, GM.gases)
if(prob(10))
GM.gases["plasma"][MOLES] += 100
GM.gases[/datum/gas/plasma][MOLES] += 100
GM.temperature = 1500+T0C //should be enough to start a fire
T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.")
qdel(src)
else
GM.gases["plasma"][MOLES] += 5
GM.gases[/datum/gas/plasma][MOLES] += 5
GM.temperature = istype(T) ? T.air.return_temperature() : T20C
T.visible_message("The [src] suddenly disgorges a cloud of plasma.")
T.assume_air(GM)
+3 -3
View File
@@ -237,9 +237,9 @@
cabin_air = new
cabin_air.temperature = T20C
cabin_air.volume = 200
cabin_air.assert_gases("o2","n2")
cabin_air.gases["o2"][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases["n2"][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
cabin_air.gases[/datum/gas/oxygen][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases[/datum/gas/nitrogen][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
return cabin_air
/obj/mecha/proc/add_radio()
@@ -279,8 +279,9 @@
qdel(H)
var/list/G_gases = G.gases
for(var/I in G_gases)
if(I != "o2" && I != "n2")
G.gases[I][MOLES] = 0
if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen)
continue
G_gases[I][MOLES] = 0
G.garbage_collect()
O.air_update_turf()
for(var/obj/machinery/atmospherics/components/unary/U in O)
@@ -168,10 +168,10 @@
for(var/obj/effect/hotspot/H in T)
qdel(H)
var/list/G_gases = G.gases
if(G_gases["plasma"])
ASSERT_GAS("n2", G)
G_gases["n2"][MOLES] += (G_gases["plasma"][MOLES])
G_gases["plasma"][MOLES] = 0
if(G_gases[/datum/gas/plasma])
ASSERT_GAS(/datum/gas/nitrogen, G)
G_gases[/datum/gas/nitrogen][MOLES] += (G_gases[/datum/gas/plasma][MOLES])
G_gases[/datum/gas/plasma][MOLES] = 0
G.garbage_collect()
for(var/obj/machinery/atmospherics/components/unary/U in T)
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
+3 -3
View File
@@ -240,9 +240,9 @@
/obj/effect/chrono_field/return_air() //we always have nominal air and temperature
var/datum/gas_mixture/GM = new
GM.assert_gases("o2","n2")
GM.gases["o2"][MOLES] = MOLES_O2STANDARD
GM.gases["n2"][MOLES] = MOLES_N2STANDARD
GM.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
GM.gases[/datum/gas/oxygen][MOLES] = MOLES_O2STANDARD
GM.gases[/datum/gas/nitrogen][MOLES] = MOLES_N2STANDARD
GM.temperature = T20C
return GM
+4 -4
View File
@@ -358,10 +358,10 @@ MASS SPECTROMETER
var/list/env_gases = environment.gases
environment.assert_gases(arglist(GLOB.hardcoded_gases))
var/o2_concentration = env_gases["o2"][MOLES]/total_moles
var/n2_concentration = env_gases["n2"][MOLES]/total_moles
var/co2_concentration = env_gases["co2"][MOLES]/total_moles
var/plasma_concentration = env_gases["plasma"][MOLES]/total_moles
var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles
var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles
var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles
var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles
environment.garbage_collect()
if(abs(n2_concentration - N2STANDARD) < 20)
+2 -2
View File
@@ -201,8 +201,8 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
if(air_transfer.gases["plasma"])
air_transfer.gases["plasma"][MOLES] *= 5
if(air_transfer.gases[/datum/gas/plasma])
air_transfer.gases[/datum/gas/plasma][MOLES] *= 5
target.assume_air(air_transfer)
//Burn it based on transfered gas
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500)
+2 -2
View File
@@ -8,7 +8,7 @@
w_class = WEIGHT_CLASS_BULKY
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
var/gas_type = "o2"
var/gas_type = /datum/gas/oxygen
var/on = FALSE
var/stabilizers = FALSE
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
@@ -128,7 +128,7 @@
icon_state = "jetpack-black"
item_state = "jetpack-black"
distribute_pressure = 0
gas_type = "co2"
gas_type = /datum/gas/carbon_dioxide
/obj/item/tank/jetpack/suit
+17 -17
View File
@@ -21,8 +21,8 @@
/obj/item/tank/internals/oxygen/New()
..()
ASSERT_GAS("o2", air_contents)
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
ASSERT_GAS(/datum/gas/oxygen, air_contents)
air_contents.gases[/datum/gas/oxygen][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -49,9 +49,9 @@
/obj/item/tank/internals/anesthetic/New()
..()
air_contents.assert_gases("o2", "n2o")
air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases["n2o"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide)
air_contents.gases[/datum/gas/oxygen][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
return
/*
@@ -67,9 +67,9 @@
/obj/item/tank/internals/air/New()
..()
air_contents.assert_gases("o2","n2")
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases["n2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrogen][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
return
@@ -87,8 +87,8 @@
/obj/item/tank/internals/plasma/New()
..()
ASSERT_GAS("plasma", air_contents)
air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
ASSERT_GAS(/datum/gas/plasma, air_contents)
air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params)
@@ -106,7 +106,7 @@
/obj/item/tank/internals/plasma/full/New()
..() // Plasma asserted in parent
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -124,13 +124,13 @@
/obj/item/tank/internals/plasmaman/New()
..()
ASSERT_GAS("plasma", air_contents)
air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
ASSERT_GAS(/datum/gas/plasma, air_contents)
air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/tank/internals/plasmaman/full/New()
..() // Plasma asserted in parent
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -144,7 +144,7 @@
/obj/item/tank/internals/plasmaman/belt/full/New()
..() // Plasma asserted in parent
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -166,8 +166,8 @@
/obj/item/tank/internals/emergency_oxygen/New()
..()
ASSERT_GAS("o2", air_contents)
air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
ASSERT_GAS(/datum/gas/oxygen, air_contents)
air_contents.gases[/datum/gas/oxygen][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/tank/internals/emergency_oxygen/engi
@@ -11,9 +11,9 @@
/obj/structure/transit_tube_pod/Initialize()
. = ..()
air_contents.add_gases("o2", "n2")
air_contents.gases["o2"][MOLES] = MOLES_O2STANDARD
air_contents.gases["n2"][MOLES] = MOLES_N2STANDARD
air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen][MOLES] = MOLES_O2STANDARD
air_contents.gases[/datum/gas/nitrogen][MOLES] = MOLES_N2STANDARD
air_contents.temperature = T20C
+13 -82
View File
@@ -1,6 +1,3 @@
#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
//This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
GLOBAL_VAR(security_mode)
GLOBAL_PROTECT(security_mode)
@@ -118,91 +115,25 @@ GLOBAL_PROTECT(security_mode)
warning("/tg/station 13 uses many file operations, a few shell()s, and some external call()s. Trusted mode is recommended. You can download our source code for your own browsing and compilation at https://github.com/tgstation/tgstation")
/world/Topic(T, addr, master, key)
var/static/list/topic_handlers = TopicHandlers()
var/list/input = params2list(T)
var/pinging = ("ping" in input)
var/playing = ("players" in input)
if(!pinging && !playing && config && CONFIG_GET(flag/log_world_topic))
var/datum/world_topic/handler
for(var/I in topic_handlers)
if(input[I])
handler = I
break
if((!handler || initial(handler.log)) && config && CONFIG_GET(flag/log_world_topic))
WRITE_FILE(GLOB.world_game_log, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]")
SERVER_TOOLS_ON_TOPIC //redirect to server tools if necessary
var/comms_key = CONFIG_GET(string/comms_key)
var/key_valid = (comms_key && input["key"] == comms_key)
if(!handler)
return
if(pinging)
var/x = 1
for (var/client/C in GLOB.clients)
x++
return x
else if(playing)
var/n = 0
for(var/mob/M in GLOB.player_list)
if(M.client)
n++
return n
else if("status" in input)
var/list/s = list()
s["version"] = GLOB.game_version
s["mode"] = GLOB.master_mode
s["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE
s["enter"] = GLOB.enter_allowed
s["vote"] = CONFIG_GET(flag/allow_vote_mode)
s["ai"] = CONFIG_GET(flag/allow_ai)
s["host"] = host ? host : null
s["active_players"] = get_active_player_count()
s["players"] = GLOB.clients.len
s["revision"] = GLOB.revdata.commit
s["revision_date"] = GLOB.revdata.date
var/list/adm = get_admin_counts()
var/list/presentmins = adm["present"]
var/list/afkmins = adm["afk"]
s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
s["gamestate"] = SSticker.current_state
s["map_name"] = SSmapping.config.map_name
if(key_valid && SSticker.HasRoundStarted())
s["real_mode"] = SSticker.mode.name
// Key-authed callers may know the truth behind the "secret"
s["security_level"] = get_security_level()
s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
// Amount of world's ticks in seconds, useful for calculating round duration
if(SSshuttle && SSshuttle.emergency)
s["shuttle_mode"] = SSshuttle.emergency.mode
// Shuttle status, see /__DEFINES/stat.dm
s["shuttle_timer"] = SSshuttle.emergency.timeLeft()
// Shuttle timer, in seconds
return list2params(s)
else if("announce" in input)
if(!key_valid)
return "Bad Key"
else
AnnouncePR(input["announce"], json_decode(input["payload"]))
else if("crossmessage" in input)
if(!key_valid)
return
else
if(input["crossmessage"] == "Ahelp")
relay_msg_admins("<span class='adminnotice'><b><font color=red>HELP: </font> [input["source"]] [input["message_sender"]]: [input["message"]]</b></span>")
if(input["crossmessage"] == "Comms_Console")
minor_announce(input["message"], "Incoming message from [input["message_sender"]]")
for(var/obj/machinery/computer/communications/CM in GLOB.machines)
CM.overrideCooldown()
if(input["crossmessage"] == "News_Report")
minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
else if("server_hop" in input)
show_server_hop_transfer_screen(input["server_hop"])
handler = new handler()
return handler.Run(input)
/world/proc/AnnouncePR(announcement, list/payload)
var/static/list/PRcounts = list() //PR id -> number of times announced this round
+3 -2
View File
@@ -434,7 +434,7 @@
output += "<th width='15%'><b>OPTIONS</b></th>"
output += "</tr>"
var/limit = " LIMIT [bansperpage * page], [bansperpage]"
var/datum/DBQuery/query_search_bans = SSdbcore.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits FROM [format_table_name("ban")] WHERE 1 [playersearch] [adminsearch] ORDER BY bantime DESC[limit]")
var/datum/DBQuery/query_search_bans = SSdbcore.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, round_id FROM [format_table_name("ban")] WHERE 1 [playersearch] [adminsearch] ORDER BY bantime DESC[limit]")
if(!query_search_bans.warn_execute())
return
@@ -452,6 +452,7 @@
var/unbanckey = query_search_bans.item[11]
var/unbantime = query_search_bans.item[12]
var/edits = query_search_bans.item[13]
var/round_id = query_search_bans.item[14]
var/lcolor = blcolor
var/dcolor = bdcolor
@@ -477,7 +478,7 @@
output += "<tr bgcolor='[dcolor]'>"
output += "<td align='center'>[typedesc]</td>"
output += "<td align='center'><b>[ckey]</b></td>"
output += "<td align='center'>[bantime]</td>"
output += "<td align='center'>[bantime] (Round ID: [round_id])</td>"
output += "<td align='center'><b>[ackey]</b></td>"
output += "<td align='center'>[(unbanned) ? "" : "<b><a href=\"byond://?src=\ref[src];[HrefToken()];dbbanedit=unban;dbbanid=[banid]\">Unban</a></b>"]</td>"
output += "</tr>"
+2 -2
View File
@@ -49,8 +49,8 @@
admin_only = TRUE
/datum/server_tools_command/namecheck/Run(sender, params)
log_admin("IRC Name Check: [sender] on [params]")
message_admins("IRC name checking on [params] from [sender]")
log_admin("Chat Name Check: [sender] on [params]")
message_admins("Name checking [params] from [sender]")
return keywords_lookup(params, 1)
/datum/server_tools_command/adminwho
+2 -2
View File
@@ -715,8 +715,8 @@ GLOBAL_PROTECT(LastAdminCalledProc)
if(Rad.anchored)
if(!Rad.loaded_tank)
var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad)
ASSERT_GAS("plasma", Plasma.air_contents)
Plasma.air_contents.gases["plasma"][MOLES] = 70
ASSERT_GAS(/datum/gas/plasma, Plasma.air_contents)
Plasma.air_contents.gases[/datum/gas/plasma][MOLES] = 70
Rad.drainratio = 0
Rad.loaded_tank = Plasma
Plasma.loc = Rad
+6 -8
View File
@@ -433,12 +433,13 @@ GLOBAL_PROTECT(VVpixelmovement)
to_chat(src, "Variable appears to be <b>[uppertext(default)]</b>.")
to_chat(src, "Variable contains: [L[index]]")
to_chat(src, "Variable contains: [variable]")
if(default == VV_NUM)
var/dir_text = ""
if(dir < 0 && dir < 16)
if(dir & 1)
var/tdir = variable
if(tdir > 0 && tdir < 16)
if(tdir & 1)
dir_text += "NORTH"
if(dir & 2)
dir_text += "SOUTH"
@@ -450,11 +451,8 @@ GLOBAL_PROTECT(VVpixelmovement)
if(dir_text)
to_chat(usr, "If a direction, direction is: [dir_text]")
var/original_var
if(assoc)
original_var = L[assoc_key]
else
original_var = L[index]
var/original_var = variable
if (O)
L = L.Copy()
var/class
+2 -1
View File
@@ -382,7 +382,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
switch(new_character.mind.special_role)
if("Wizard")
new_character.forceMove(pick(GLOB.wizardstart))
SSticker.mode.equip_wizard(new_character)
var/datum/antagonist/wizard/A = new_character.mind.has_antag_datum(/datum/antagonist/wizard,TRUE)
A.equip_wizard()
if("Syndicate")
new_character.forceMove(pick(GLOB.nukeop_start))
call(/datum/game_mode/proc/equip_syndicate)(new_character)
+3 -7
View File
@@ -51,10 +51,6 @@
GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
message_admins("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>")
else
status = FALSE
GLOB.bombers += "[key_name(user)] unwelded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
to_chat(user, "<span class='notice'>The hole has been closed.</span>")
add_fingerprint(user)
..()
@@ -107,8 +103,8 @@
return
/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode
air_contents.assert_gases("plasma", "o2")
var/fuel_moles = air_contents.gases["plasma"][MOLES] + air_contents.gases["o2"][MOLES]/6
air_contents.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
var/fuel_moles = air_contents.gases[/datum/gas/plasma][MOLES] + air_contents.gases[/datum/gas/oxygen][MOLES]/6
air_contents.garbage_collect()
var/strength = 1
@@ -164,4 +160,4 @@
if(!T)
return
T.assume_air(removed)
air_update_turf()
air_update_turf()
@@ -12,8 +12,8 @@
if(!air_contents)
return 0
var/oxy = air_contents.gases["o2"] ? air_contents.gases["o2"][MOLES] : 0
var/tox = air_contents.gases["plasma"] ? air_contents.gases["plasma"][MOLES] : 0
var/oxy = air_contents.gases[/datum/gas/oxygen] ? air_contents.gases[/datum/gas/oxygen][MOLES] : 0
var/tox = air_contents.gases[/datum/gas/plasma] ? air_contents.gases[/datum/gas/plasma][MOLES] : 0
if(active_hotspot)
if(soh)
@@ -112,7 +112,7 @@
qdel(src)
return
if(!(location.air) || !location.air.gases["plasma"] || !location.air.gases["o2"] || location.air.gases["plasma"][MOLES] < 0.5 || location.air.gases["o2"][MOLES] < 0.5)
if(!(location.air) || !location.air.gases[/datum/gas/plasma] || !location.air.gases[/datum/gas/oxygen] || location.air.gases[/datum/gas/plasma][MOLES] < 0.5 || location.air.gases[/datum/gas/oxygen][MOLES] < 0.5)
qdel(src)
return
@@ -268,8 +268,11 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
gas -= "TEMP"
gases.Cut()
for(var/id in gas)
ADD_GAS(id, gases)
gases[id][MOLES] = text2num(gas[id])
var/path = id
if(!ispath(path))
path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around
ADD_GAS(path, gases)
gases[path][MOLES] = text2num(gas[id])
return 1
/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
@@ -1,9 +1,9 @@
GLOBAL_LIST_INIT(hardcoded_gases, list("o2","n2","co2","plasma")) //the main four gases, which were at one time hardcoded
GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma)) //the main four gases, which were at one time hardcoded
/proc/meta_gas_list()
. = new /list
for(var/gas_path in subtypesof(/datum/gas))
var/list/gas_info = new(5)
. = subtypesof(/datum/gas)
for(var/gas_path in .)
var/list/gas_info = new(6)
var/datum/gas/gas = gas_path
gas_info[META_GAS_SPECIFIC_HEAT] = initial(gas.specific_heat)
@@ -12,7 +12,14 @@ GLOBAL_LIST_INIT(hardcoded_gases, list("o2","n2","co2","plasma")) //the main fou
if(initial(gas.moles_visible) != null)
gas_info[META_GAS_OVERLAY] = new /obj/effect/overlay/gas(initial(gas.gas_overlay))
gas_info[META_GAS_DANGER] = initial(gas.dangerous)
.[initial(gas.id)] = gas_info
gas_info[META_GAS_ID] = initial(gas.id)
.[gas_path] = gas_info
/proc/gas_id2path(id)
var/meta_gas = meta_gas_list()
for(var/path in meta_gas)
if(meta_gas[path][META_GAS_ID] == id)
return path
/*||||||||||||||/----------\||||||||||||||*\
||||||||||||||||[GAS DATUMS]||||||||||||||||
@@ -69,8 +69,8 @@
/datum/gas_mixture/immutable/cloner/garbage_collect()
..()
ADD_GAS("n2", gases)
gases["n2"][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD
ADD_GAS(/datum/gas/nitrogen, gases)
gases[/datum/gas/nitrogen][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD
/datum/gas_mixture/immutable/cloner/heat_capacity()
return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20
@@ -44,21 +44,21 @@
/datum/gas_reaction/agent_b/init_reqs()
min_requirements = list(
"TEMP" = 900,
"agent_b" = MINIMUM_HEAT_CAPACITY,
"plasma" = MINIMUM_HEAT_CAPACITY,
"co2" = MINIMUM_HEAT_CAPACITY
/datum/gas/oxygen_agent_b = MINIMUM_HEAT_CAPACITY,
/datum/gas/plasma = MINIMUM_HEAT_CAPACITY,
/datum/gas/carbon_dioxide = MINIMUM_HEAT_CAPACITY
)
/datum/gas_reaction/agent_b/react(datum/gas_mixture/air)
var/list/cached_gases = air.gases
var/reaction_rate = min(cached_gases["co2"][MOLES]*0.75, cached_gases["plasma"][MOLES]*0.25, cached_gases["agent_b"][MOLES]*0.05)
var/reaction_rate = min(cached_gases[/datum/gas/carbon_dioxide][MOLES]*0.75, cached_gases[/datum/gas/plasma][MOLES]*0.25, cached_gases[/datum/gas/oxygen_agent_b][MOLES]*0.05)
cached_gases["co2"][MOLES] -= reaction_rate
cached_gases["agent_b"][MOLES] -= reaction_rate*0.05
cached_gases[/datum/gas/carbon_dioxide][MOLES] -= reaction_rate
cached_gases[/datum/gas/oxygen_agent_b][MOLES] -= reaction_rate*0.05
ASSERT_GAS("o2", air) //only need to assert oxygen, as this reaction doesn't occur without the other gases existing
cached_gases["o2"][MOLES] += reaction_rate
ASSERT_GAS(/datum/gas/oxygen, air) //only need to assert oxygen, as this reaction doesn't occur without the other gases existing
cached_gases[/datum/gas/oxygen][MOLES] += reaction_rate
air.temperature -= (reaction_rate*20000)/air.heat_capacity()
@@ -71,7 +71,7 @@
id = "freon"
/datum/gas_reaction/freon/init_reqs()
min_requirements = list("freon" = MOLES_PLASMA_VISIBLE)
min_requirements = list(/datum/gas/freon = MOLES_PLASMA_VISIBLE)
/datum/gas_reaction/freon/react(datum/gas_mixture/air, turf/open/location)
. = NO_REACTION
@@ -85,12 +85,12 @@
id = "vapor"
/datum/gas_reaction/water_vapor/init_reqs()
min_requirements = list("water_vapor" = MOLES_PLASMA_VISIBLE)
min_requirements = list(/datum/gas/water_vapor = MOLES_PLASMA_VISIBLE)
/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, turf/open/location)
. = NO_REACTION
if(location && location.water_vapor_gas_act())
air.gases["water_vapor"][MOLES] -= MOLES_PLASMA_VISIBLE
air.gases[/datum/gas/water_vapor][MOLES] -= MOLES_PLASMA_VISIBLE
. = REACTING
//fire: combustion of plasma and volatile fuel (treated as hydrocarbons). creates hotspots. exothermic
@@ -111,28 +111,28 @@
cached_results[id] = 0
//General volatile gas burn
if(cached_gases["v_fuel"] && cached_gases["v_fuel"][MOLES])
if(cached_gases[/datum/gas/volatile_fuel] && cached_gases[/datum/gas/volatile_fuel][MOLES])
var/burned_fuel
if(!cached_gases["o2"])
if(!cached_gases[/datum/gas/oxygen])
burned_fuel = 0
else if(cached_gases["o2"][MOLES] < cached_gases["v_fuel"][MOLES])
burned_fuel = cached_gases["o2"][MOLES]
cached_gases["v_fuel"][MOLES] -= burned_fuel
cached_gases["o2"][MOLES] = 0
else if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/volatile_fuel][MOLES])
burned_fuel = cached_gases[/datum/gas/oxygen][MOLES]
cached_gases[/datum/gas/volatile_fuel][MOLES] -= burned_fuel
cached_gases[/datum/gas/oxygen][MOLES] = 0
else
burned_fuel = cached_gases["v_fuel"][MOLES]
cached_gases["o2"][MOLES] -= cached_gases["v_fuel"][MOLES]
burned_fuel = cached_gases[/datum/gas/volatile_fuel][MOLES]
cached_gases[/datum/gas/oxygen][MOLES] -= cached_gases[/datum/gas/volatile_fuel][MOLES]
if(burned_fuel)
energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel
ASSERT_GAS("co2", air)
cached_gases["co2"][MOLES] += burned_fuel
ASSERT_GAS(/datum/gas/carbon_dioxide, air)
cached_gases[/datum/gas/carbon_dioxide][MOLES] += burned_fuel
cached_results[id] += burned_fuel
//Handle plasma burning
if(cached_gases["plasma"] && cached_gases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY)
if(cached_gases[/datum/gas/plasma] && cached_gases[/datum/gas/plasma][MOLES] > MINIMUM_HEAT_CAPACITY)
var/plasma_burn_rate = 0
var/oxygen_burn_rate = 0
//more plasma released at higher temperatures
@@ -142,17 +142,17 @@
else
temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
if(temperature_scale > 0)
ASSERT_GAS("o2", air)
ASSERT_GAS(/datum/gas/oxygen, air)
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
if(cached_gases["o2"][MOLES] > cached_gases["plasma"][MOLES]*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (cached_gases["plasma"][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
if(cached_gases[/datum/gas/oxygen][MOLES] > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
else
plasma_burn_rate = (temperature_scale*(cached_gases["o2"][MOLES]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
plasma_burn_rate = (temperature_scale*(cached_gases[/datum/gas/oxygen][MOLES]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
ASSERT_GAS("co2", air)
cached_gases["plasma"][MOLES] = QUANTIZE(cached_gases["plasma"][MOLES] - plasma_burn_rate)
cached_gases["o2"][MOLES] = QUANTIZE(cached_gases["o2"][MOLES] - (plasma_burn_rate * oxygen_burn_rate))
cached_gases["co2"][MOLES] += plasma_burn_rate
ASSERT_GAS(/datum/gas/carbon_dioxide, air)
cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate)
cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_rate))
cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
@@ -185,36 +185,36 @@
/datum/gas_reaction/fusion/init_reqs()
min_requirements = list(
"ENER" = PLASMA_BINDING_ENERGY * 10,
"plasma" = MINIMUM_HEAT_CAPACITY,
"co2" = MINIMUM_HEAT_CAPACITY
/datum/gas/plasma = MINIMUM_HEAT_CAPACITY,
/datum/gas/carbon_dioxide = MINIMUM_HEAT_CAPACITY
)
/datum/gas_reaction/fusion/react(datum/gas_mixture/air)
var/list/cached_gases = air.gases
var/temperature = air.temperature
if((cached_gases["plasma"][MOLES]+cached_gases["co2"][MOLES])/air.total_moles() < FUSION_PURITY_THRESHOLD)
if((cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/carbon_dioxide][MOLES])/air.total_moles() < FUSION_PURITY_THRESHOLD)
//Fusion wont occur if the level of impurities is too high.
return NO_REACTION
var/old_heat_capacity = air.heat_capacity()
var/carbon_efficency = min(cached_gases["plasma"][MOLES]/cached_gases["co2"][MOLES],MAX_CARBON_EFFICENCY)
var/carbon_efficency = min(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/carbon_dioxide][MOLES],MAX_CARBON_EFFICENCY)
var/reaction_energy = THERMAL_ENERGY(air)
var/moles_impurities = air.total_moles()-(cached_gases["plasma"][MOLES]+cached_gases["co2"][MOLES])
var/moles_impurities = air.total_moles()-(cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/carbon_dioxide][MOLES])
var/plasma_fused = (PLASMA_FUSED_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
var/carbon_catalyzed = (CARBON_CATALYST_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
var/oxygen_added = carbon_catalyzed
var/nitrogen_added = (plasma_fused-oxygen_added)-(THERMAL_ENERGY(air)/PLASMA_BINDING_ENERGY)
reaction_energy = max(reaction_energy+((carbon_efficency*cached_gases["plasma"][MOLES])/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0)
reaction_energy = max(reaction_energy+((carbon_efficency*cached_gases[/datum/gas/plasma][MOLES])/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0)
air.assert_gases("o2", "n2")
air.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
cached_gases["plasma"][MOLES] -= plasma_fused
cached_gases["co2"][MOLES] -= carbon_catalyzed
cached_gases["o2"][MOLES] += oxygen_added
cached_gases["n2"][MOLES] += nitrogen_added
cached_gases[/datum/gas/plasma][MOLES] -= plasma_fused
cached_gases[/datum/gas/carbon_dioxide][MOLES] -= carbon_catalyzed
cached_gases[/datum/gas/oxygen][MOLES] += oxygen_added
cached_gases[/datum/gas/nitrogen][MOLES] += nitrogen_added
if(reaction_energy > 0)
var/new_heat_capacity = air.heat_capacity()
+31 -31
View File
@@ -73,44 +73,44 @@
var/datum/radio_frequency/radio_connection
var/list/TLV = list( // Breathable air.
"pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
"temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K
"o2" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
"n2" = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa
"co2" = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa
"plasma" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
"n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
"bz" = new/datum/tlv(-1, -1, 0.2, 0.5),
"freon" = new/datum/tlv(-1, -1, 0.2, 0.5),
"water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5)
"pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
"temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K
/datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
/datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa
/datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa
/datum/gas/plasma = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
/datum/gas/nitrous_oxide = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
/datum/gas/bz = new/datum/tlv(-1, -1, 0.2, 0.5),
/datum/gas/freon = new/datum/tlv(-1, -1, 0.2, 0.5),
/datum/gas/water_vapor = new/datum/tlv(-1, -1, 0.2, 0.5)
)
/obj/machinery/airalarm/server // No checks here.
TLV = list(
"pressure" = new/datum/tlv(-1, -1, -1, -1),
"temperature" = new/datum/tlv(-1, -1, -1, -1),
"o2" = new/datum/tlv(-1, -1, -1, -1),
"n2" = new/datum/tlv(-1, -1, -1, -1),
"co2" = new/datum/tlv(-1, -1, -1, -1),
"plasma" = new/datum/tlv(-1, -1, -1, -1),
"n2o" = new/datum/tlv(-1, -1, -1, -1),
"bz" = new/datum/tlv(-1, -1, -1, -1),
"freon" = new/datum/tlv(-1, -1, -1, -1),
"water_vapor" = new/datum/tlv(-1, -1, -1, -1)
"pressure" = new/datum/tlv(-1, -1, -1, -1),
"temperature" = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/oxygen = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/nitrogen = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/plasma = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/nitrous_oxide = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/bz = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/freon = new/datum/tlv(-1, -1, -1, -1),
/datum/gas/water_vapor = new/datum/tlv(-1, -1, -1, -1)
)
/obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures.
TLV = list(
"pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
"temperature" = new/datum/tlv(200,210,273.15,283.15), // K
"o2" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
"n2" = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa
"co2" = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa
"plasma" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
"n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
"bz" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
"freon" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
"water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5)
"pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
"temperature" = new/datum/tlv(200,210,273.15,283.15), // K
/datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
/datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa
/datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa
/datum/gas/plasma = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
/datum/gas/nitrous_oxide = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa
/datum/gas/bz = new/datum/tlv(-1, -1, 0.2, 0.5),
/datum/gas/freon = new/datum/tlv(-1, -1, 0.2, 0.5),
/datum/gas/water_vapor = new/datum/tlv(-1, -1, 0.2, 0.5)
)
/obj/machinery/airalarm/engine
@@ -760,4 +760,4 @@
#undef AALARM_MODE_SIPHON
#undef AALARM_MODE_CONTAMINATED
#undef AALARM_MODE_REFILL
#undef AALARM_REPORT_TIMEOUT
#undef AALARM_REPORT_TIMEOUT
@@ -187,7 +187,7 @@
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
beaker.reagents.trans_to(occupant, 1, 10 * efficiency) // Transfer reagents, multiplied because cryo magic.
beaker.reagents.reaction(occupant, VAPOR)
air1.gases["o2"][MOLES] -= 2 / efficiency // Lets use gas for this.
air1.gases[/datum/gas/oxygen][MOLES] -= 2 / efficiency //Let's use gas for this
if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker).
reagent_transfer = 0
@@ -201,7 +201,7 @@
var/datum/gas_mixture/air1 = AIR1
if(!NODE1 || !AIR1 || !air1.gases.len || air1.gases["o2"][MOLES] < 5) // Turn off if the machine won't work.
if(!NODE1 || !AIR1 || !air1.gases.len || air1.gases[/datum/gas/oxygen][MOLES] < 5) // Turn off if the machine won't work.
on = FALSE
update_icon()
return
@@ -221,7 +221,7 @@
air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB)
air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
air1.gases[/datum/gas/oxygen][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
/obj/machinery/atmospherics/components/unary/cryo_cell/power_change()
..()
@@ -49,8 +49,8 @@
var/added_oxygen = oxygen_content - total_moles
air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen)
ASSERT_GAS("o2", air_contents)
air_contents.gases["o2"][MOLES] += added_oxygen
ASSERT_GAS(/datum/gas/oxygen, air_contents)
air_contents.gases[/datum/gas/oxygen][MOLES] += added_oxygen
update_parents()
@@ -21,23 +21,23 @@
name = "[name] ([air_contents.gases[gas_type][GAS_META][META_GAS_NAME]])"
/obj/machinery/atmospherics/components/unary/tank/carbon_dioxide
gas_type = "co2"
gas_type = /datum/gas/carbon_dioxide
/obj/machinery/atmospherics/components/unary/tank/toxins
icon_state = "orange"
gas_type = "plasma"
gas_type = /datum/gas/plasma
/obj/machinery/atmospherics/components/unary/tank/oxygen_agent_b
icon_state = "orange_2"
gas_type = "agent_b"
gas_type = /datum/gas/oxygen_agent_b
/obj/machinery/atmospherics/components/unary/tank/oxygen
icon_state = "blue"
gas_type = "o2"
gas_type = /datum/gas/oxygen
/obj/machinery/atmospherics/components/unary/tank/nitrogen
icon_state = "red"
gas_type = "n2"
gas_type = /datum/gas/nitrogen
/obj/machinery/atmospherics/components/unary/tank/air
icon_state = "grey"
@@ -46,6 +46,6 @@
/obj/machinery/atmospherics/components/unary/tank/air/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.assert_gases("o2", "n2")
air_contents.gases["o2"][MOLES] = AIR_CONTENTS * 0.2
air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen][MOLES] = AIR_CONTENTS * 0.2
air_contents.gases[/datum/gas/nitrogen][MOLES] = AIR_CONTENTS * 0.8
@@ -174,7 +174,7 @@
if(scrubbing & SCRUBBING)
var/should_we_scrub = FALSE
for(var/id in env_gases)
if(id == "n2" || id == "o2")
if(id == /datum/gas/nitrogen || id == /datum/gas/oxygen)
continue
if(env_gases[id][MOLES])
should_we_scrub = TRUE
@@ -194,40 +194,40 @@
var/list/filtered_gases = filtered_out.gases
filtered_out.temperature = removed.temperature
if(scrub_Toxins && removed_gases["plasma"])
ADD_GAS("plasma", filtered_out.gases)
filtered_gases["plasma"][MOLES] = removed_gases["plasma"][MOLES]
removed.gases["plasma"][MOLES] = 0
if(scrub_Toxins && removed_gases[/datum/gas/plasma])
ADD_GAS(/datum/gas/plasma, filtered_out.gases)
filtered_gases[/datum/gas/plasma][MOLES] = removed_gases[/datum/gas/plasma][MOLES]
removed_gases[/datum/gas/plasma][MOLES] = 0
if(scrub_CO2 && removed_gases["co2"])
ADD_GAS("co2", filtered_out.gases)
filtered_gases["co2"][MOLES] = removed_gases["co2"][MOLES]
removed_gases["co2"][MOLES] = 0
if(scrub_CO2 && removed_gases[/datum/gas/carbon_dioxide])
ADD_GAS(/datum/gas/carbon_dioxide, filtered_out.gases)
filtered_gases[/datum/gas/carbon_dioxide][MOLES] = removed_gases[/datum/gas/carbon_dioxide][MOLES]
removed_gases[/datum/gas/carbon_dioxide][MOLES] = 0
if(removed_gases["agent_b"])
ADD_GAS("agent_b", filtered_out.gases)
filtered_gases["agent_b"][MOLES] = removed_gases["agent_b"][MOLES]
removed_gases["agent_b"][MOLES] = 0
if(removed_gases[/datum/gas/oxygen_agent_b])
ADD_GAS(/datum/gas/oxygen_agent_b, filtered_out.gases)
filtered_gases[/datum/gas/oxygen_agent_b][MOLES] = removed_gases[/datum/gas/oxygen_agent_b][MOLES]
removed_gases[/datum/gas/oxygen_agent_b][MOLES] = 0
if(scrub_N2O && removed_gases["n2o"])
ADD_GAS("n2o", filtered_out.gases)
filtered_gases["n2o"][MOLES] = removed_gases["n2o"][MOLES]
removed_gases["n2o"][MOLES] = 0
if(scrub_N2O && removed_gases[/datum/gas/nitrous_oxide])
ADD_GAS(/datum/gas/nitrous_oxide, filtered_out.gases)
filtered_gases[/datum/gas/nitrous_oxide][MOLES] = removed_gases[/datum/gas/nitrous_oxide][MOLES]
removed_gases[/datum/gas/nitrous_oxide][MOLES] = 0
if(scrub_BZ && removed_gases["bz"])
ADD_GAS("bz", filtered_out.gases)
filtered_gases["bz"][MOLES] = removed_gases["bz"][MOLES]
removed_gases["bz"][MOLES] = 0
if(scrub_BZ && removed_gases[/datum/gas/bz])
ADD_GAS(/datum/gas/bz, filtered_out.gases)
filtered_gases[/datum/gas/bz][MOLES] = removed_gases[/datum/gas/bz][MOLES]
removed_gases[/datum/gas/bz][MOLES] = 0
if(scrub_Freon && removed_gases["freon"])
ADD_GAS("freon", filtered_out.gases)
filtered_gases["freon"][MOLES] = removed_gases["freon"][MOLES]
removed_gases["freon"][MOLES] = 0
if(scrub_Freon && removed_gases[/datum/gas/freon])
ADD_GAS(/datum/gas/freon, filtered_out.gases)
filtered_gases[/datum/gas/freon][MOLES] = removed_gases[/datum/gas/freon][MOLES]
removed_gases[/datum/gas/freon][MOLES] = 0
if(scrub_WaterVapor && removed_gases["water_vapor"])
ADD_GAS("water_vapor", filtered_out.gases)
filtered_gases["water_vapor"][MOLES] = removed_gases["water_vapor"][MOLES]
removed_gases["water_vapor"][MOLES] = 0
if(scrub_WaterVapor && removed_gases[/datum/gas/water_vapor])
ADD_GAS(/datum/gas/water_vapor, filtered_out.gases)
filtered_gases[/datum/gas/water_vapor][MOLES] = removed_gases[/datum/gas/water_vapor][MOLES]
removed_gases[/datum/gas/water_vapor][MOLES] = 0
removed.garbage_collect()
@@ -146,49 +146,49 @@
/obj/machinery/atmospherics/miner/n2o
name = "\improper N2O Gas Miner"
overlay_color = "#FFCCCC"
spawn_id = "n2o"
spawn_id = /datum/gas/nitrous_oxide
/obj/machinery/atmospherics/miner/nitrogen
name = "\improper N2 Gas Miner"
overlay_color = "#CCFFCC"
spawn_id = "n2"
spawn_id = /datum/gas/nitrogen
/obj/machinery/atmospherics/miner/oxygen
name = "\improper O2 Gas Miner"
overlay_color = "#007FFF"
spawn_id = "o2"
spawn_id = /datum/gas/oxygen
/obj/machinery/atmospherics/miner/toxins
name = "\improper Plasma Gas Miner"
overlay_color = "#FF0000"
spawn_id = "plasma"
spawn_id = /datum/gas/plasma
/obj/machinery/atmospherics/miner/carbon_dioxide
name = "\improper CO2 Gas Miner"
overlay_color = "#CDCDCD"
spawn_id = "co2"
spawn_id = /datum/gas/carbon_dioxide
/obj/machinery/atmospherics/miner/bz
name = "\improper BZ Gas Miner"
overlay_color = "#FAFF00"
spawn_id = "bz"
spawn_id = /datum/gas/bz
/obj/machinery/atmospherics/miner/freon
name = "\improper Freon Gas Miner"
overlay_color = "#00FFE5"
spawn_id = "freon"
spawn_id = /datum/gas/freon
/obj/machinery/atmospherics/miner/volatile_fuel
name = "\improper Volatile Fuel Gas Miner"
overlay_color = "#564040"
spawn_id = "v_fuel"
spawn_id = /datum/gas/volatile_fuel
/obj/machinery/atmospherics/miner/agent_b
name = "\improper Agent B Gas Miner"
overlay_color = "#E81E24"
spawn_id = "agent_b"
spawn_id = /datum/gas/oxygen_agent_b
/obj/machinery/atmospherics/miner/water_vapor
name = "\improper Water Vapor Gas Miner"
overlay_color = "#99928E"
spawn_id = "water_vapor"
spawn_id = /datum/gas/water_vapor
@@ -12,7 +12,7 @@
volume = 1000
var/filled = 0.5
var/gas_type = ""
var/gas_type
var/release_pressure = ONE_ATMOSPHERE
var/can_max_release_pressure = (ONE_ATMOSPHERE * 10)
var/can_min_release_pressure = (ONE_ATMOSPHERE / 10)
@@ -59,42 +59,42 @@
name = "n2 canister"
desc = "Nitrogen gas. Reportedly useful for something."
icon_state = "red"
gas_type = "n2"
gas_type = /datum/gas/nitrogen
/obj/machinery/portable_atmospherics/canister/oxygen
name = "o2 canister"
desc = "Oxygen. Necessary for human life."
icon_state = "blue"
gas_type = "o2"
gas_type = /datum/gas/oxygen
/obj/machinery/portable_atmospherics/canister/carbon_dioxide
name = "co2 canister"
desc = "Carbon dioxide. What the fuck is carbon dioxide?"
icon_state = "black"
gas_type = "co2"
gas_type = /datum/gas/carbon_dioxide
/obj/machinery/portable_atmospherics/canister/toxins
name = "plasma canister"
desc = "Plasma gas. The reason YOU are here. Highly toxic."
icon_state = "orange"
gas_type = "plasma"
gas_type = /datum/gas/plasma
/obj/machinery/portable_atmospherics/canister/agent_b
name = "agent b canister"
desc = "Oxygen Agent B. You're not quite sure what it does."
gas_type = "agent_b"
gas_type = /datum/gas/oxygen_agent_b
/obj/machinery/portable_atmospherics/canister/bz
name = "BZ canister"
desc = "BZ, a powerful hallucinogenic nerve agent."
icon_state = "purple"
gas_type = "bz"
gas_type = /datum/gas/bz
/obj/machinery/portable_atmospherics/canister/nitrous_oxide
name = "n2o canister"
desc = "Nitrous oxide gas. Known to cause drowsiness."
icon_state = "redws"
gas_type = "n2o"
gas_type = /datum/gas/nitrous_oxide
/obj/machinery/portable_atmospherics/canister/air
name = "air canister"
@@ -105,14 +105,14 @@
name = "freon canister"
desc = "Freon. Great for the atmosphere!"
icon_state = "freon"
gas_type = "freon"
gas_type = /datum/gas/freon
starter_temp = 120
/obj/machinery/portable_atmospherics/canister/water_vapor
name = "water vapor canister"
desc = "Water Vapor. We get it, you vape."
icon_state = "water_vapor"
gas_type = "water_vapor"
gas_type = /datum/gas/water_vapor
filled = 1
/obj/machinery/portable_atmospherics/canister/proc/get_time_left()
@@ -148,7 +148,7 @@
name = "prototype canister"
desc = "A prototype canister for a prototype bike, what could go wrong?"
icon_state = "proto"
gas_type = "o2"
gas_type = /datum/gas/oxygen
filled = 1
release_pressure = ONE_ATMOSPHERE*2
@@ -181,9 +181,9 @@
if(starter_temp)
air_contents.temperature = starter_temp
/obj/machinery/portable_atmospherics/canister/air/create_gas()
air_contents.add_gases("o2","n2")
air_contents.gases["o2"][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.gases["n2"][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.gases[/datum/gas/nitrogen][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
#define HOLDING 1
#define CONNECTED 2
@@ -99,8 +99,8 @@
if("power")
on = !on
if(on && !holding)
var/plasma = air_contents.gases["plasma"]
var/n2o = air_contents.gases["n2o"]
var/plasma = air_contents.gases[/datum/gas/plasma]
var/n2o = air_contents.gases[/datum/gas/nitrous_oxide]
if(n2o || plasma)
var/area/A = get_area(src)
message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]")
@@ -138,4 +138,4 @@
holding.loc = get_turf(src)
holding = null
. = TRUE
update_icon()
update_icon()
@@ -7,7 +7,7 @@
var/volume_rate = 1000
volume = 1000
var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon", "water_vapor")
var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/oxygen_agent_b, /datum/gas/bz, /datum/gas/freon, /datum/gas/water_vapor)
/obj/machinery/portable_atmospherics/scrubber/Destroy()
var/turf/T = get_turf(src)
@@ -108,27 +108,12 @@
/obj/structure/academy_wizard_spawner/proc/summon_wizard()
var/turf/T = src.loc
var/mob/living/carbon/human/wizbody = new(T)
wizbody.equipOutfit(/datum/outfit/wizard/academy)
var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(wizbody)
Implant.implant(wizbody)
wizbody.faction |= "wizard"
wizbody.real_name = "Academy Teacher"
wizbody.name = "Academy Teacher"
var/datum/mind/wizmind = new /datum/mind()
wizmind.name = "Wizard Defender"
wizbody.fully_replace_character_name("Academy Teacher")
wizbody.mind_initialize()
var/datum/mind/wizmind = wizbody.mind
wizmind.special_role = "Academy Defender"
var/datum/objective/O = new("Protect Wizard Academy from the intruders")
wizmind.objectives += O
wizmind.transfer_to(wizbody)
SSticker.mode.wizards |= wizmind
wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt)
wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
wizmind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball)
wizmind.add_antag_datum(/datum/antagonist/wizard/academy)
current_wizard = wizbody
give_control()
+14
View File
@@ -265,6 +265,20 @@
back = /obj/item/storage/backpack
backpack_contents = list(/obj/item/storage/box=1)
/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
return
var/obj/item/spellbook/S = locate() in H.held_items
if(S)
S.owner = H
/datum/outfit/wizard/apprentice
name = "Wizard Apprentice"
r_hand = null
l_hand = null
r_pocket = /obj/item/teleportation_scroll/apprentice
/datum/outfit/wizard/red
name = "Red Wizard"
+8 -8
View File
@@ -167,9 +167,9 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
if(!GM.gases["o2"])
if(!GM.gases[/datum/gas/oxygen])
return
GM.gases["o2"][MOLES] -= severity * holder.energy
GM.gases[/datum/gas/oxygen][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/nitro_eater
@@ -182,9 +182,9 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
if(!GM.gases["n2"])
if(!GM.gases[/datum/gas/nitrogen])
return
GM.gases["n2"][MOLES] -= severity * holder.energy
GM.gases[/datum/gas/nitrogen][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/carbondioxide_eater
@@ -197,9 +197,9 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
if(!GM.gases["co2"])
if(!GM.gases[/datum/gas/carbon_dioxide])
return
GM.gases["co2"][MOLES] -= severity * holder.energy
GM.gases[/datum/gas/carbon_dioxide][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/plasma_eater
@@ -212,9 +212,9 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
if(!GM.gases["plasma"])
if(!GM.gases[/datum/gas/plasma])
return
GM.gases["plasma"][MOLES] -= severity * holder.energy
GM.gases[/datum/gas/plasma][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/thorns
+1 -1
View File
@@ -40,7 +40,7 @@
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(ruins_spaceworthiness && !(H.z in GLOB.station_z_levels) || isspaceturf(H.loc) || isplasmaman(H))
continue //#savetheminers
if(ruins_wizard_loadout && H.mind && ((H.mind in SSticker.mode.wizards) || (H.mind in SSticker.mode.apprentices)))
if(ruins_wizard_loadout && iswizard(H))
continue
if(item_set == "catgirls2015") //Wizard code means never having to say you're sorry
H.gender = FEMALE
+11 -28
View File
@@ -24,35 +24,18 @@
I.name = I.dna.real_name
I.updateappearance(mutcolor_update=1)
I.domutcheck()
if(W.ears)
I.equip_to_slot_or_del(new W.ears.type, slot_ears)
if(W.w_uniform)
I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform)
if(W.shoes)
I.equip_to_slot_or_del(new W.shoes.type, slot_shoes)
if(W.wear_suit)
I.equip_to_slot_or_del(new W.wear_suit.type, slot_wear_suit)
if(W.head)
I.equip_to_slot_or_del(new W.head.type, slot_head)
if(W.back)
I.equip_to_slot_or_del(new W.back.type, slot_back)
I.key = C.key
//Operation: Fuck off and scare people
I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard)
if(!master.wiz_team)
master.create_wiz_team()
var/datum/antagonist/wizard/apprentice/imposter = new(I.mind)
imposter.master = M
imposter.wiz_team = master.wiz_team
master.wiz_team += imposter
I.mind.add_antag_datum(imposter)
//Remove if possible
SSticker.mode.apprentices += I.mind
I.mind.special_role = "imposter"
var/datum/objective/protect/protect_objective = new /datum/objective/protect
protect_objective.owner = I.mind
protect_objective.target = W.mind
protect_objective.explanation_text = "Protect [W.real_name], the wizard."
I.mind.objectives += protect_objective
SSticker.mode.update_wiz_icons_added(I.mind)
I.log_message("<font color='red'>Is an imposter!</font>", INDIVIDUAL_ATTACK_LOG)
to_chat(I, "<B>You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!</B>")
//
I.log_message("<font color='red'>Is an imposter!</font>", INDIVIDUAL_ATTACK_LOG) //?
SEND_SOUND(I, sound('sound/effects/magic.ogg'))
+1 -1
View File
@@ -82,7 +82,7 @@
var/list/mobs = list()
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(H.stat || !H.mind || (H.mind in SSticker.mode.wizards) || (H.mind in SSticker.mode.apprentices))
if(H.stat || !H.mind || iswizard(H))
continue //the wizard(s) are spared on this one
mobs += H
+5
View File
@@ -38,10 +38,13 @@
user.visible_message("<B>[user]</B> laughs so hard they begin to suffocate!")
return (OXYLOSS)
//Banana Peel
/obj/item/grown/bananapeel
seed = /obj/item/seeds/banana
name = "banana peel"
desc = "A peel from a banana."
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
icon_state = "banana_peel"
item_state = "banana_peel"
w_class = WEIGHT_CLASS_TINY
@@ -81,6 +84,7 @@
name = "mimana peel"
desc = "A mimana peel."
icon_state = "mimana_peel"
item_state = "mimana_peel"
// Bluespace Banana
/obj/item/seeds/banana/bluespace
@@ -100,6 +104,7 @@
seed = /obj/item/seeds/banana/bluespace
name = "bluespace banana"
icon_state = "banana_blue"
item_state = "bluespace_peel"
trash = /obj/item/grown/bananapeel/bluespace
filling_color = "#0000FF"
origin_tech = "biotech=3;bluespace=5"
+2 -2
View File
@@ -181,8 +181,8 @@
if(isopenturf(loc))
var/turf/open/O = loc
if(O.air)
var/G = O.air.gases
if(G["o2"][MOLES] > 13)
var/loc_gases = O.air.gases
if(loc_gases[/datum/gas/oxygen][MOLES] > 13)
return 1
return 0
@@ -375,7 +375,7 @@
if(GLOB.highlander)
to_chat(humanc, "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>")
humanc.make_scottish()
if(prob(2) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in humanc.client.prefs.be_special)
if(prob(5) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in humanc.client.prefs.be_special)
SSticker.generate_miscreant_objectives(humanc.mind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
@@ -597,14 +597,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
target.faction = list("neutral")
return 1
/proc/show_server_hop_transfer_screen(expected_key)
//only show it to incoming ghosts
for(var/mob/dead/observer/O in GLOB.player_list)
if(O.key == expected_key)
if(O.client)
new /obj/screen/splash(O.client, TRUE)
break
//this is a mob verb instead of atom for performance reasons
//see /mob/verb/examinate() in mob.dm for more info
//overriden here and in /mob/living for different point span classes and sanity checks
+54 -54
View File
@@ -1,54 +1,54 @@
/mob/living/carbon/alien/Life()
findQueen()
return..()
/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
return
if(!breath || (breath.total_moles() == 0))
//Aliens breathe in vaccuum
return 0
var/toxins_used = 0
var/tox_detect_threshold = 0.02
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases
breath.assert_gases("plasma", "o2")
//Partial pressure of the toxins in our breath
var/Toxins_pp = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
adjustPlasma(breath_gases["plasma"][MOLES]*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
toxins_used = breath_gases["plasma"][MOLES]
else
clear_alert("alien_tox")
//Breathe in toxins and out oxygen
breath_gases["plasma"][MOLES] -= toxins_used
breath_gases["o2"][MOLES] += toxins_used
breath.garbage_collect()
//BREATH TEMPERATURE
handle_breath_temperature(breath)
/mob/living/carbon/alien/handle_status_effects()
..()
//natural reduction of movement delay due to stun.
if(move_delay_add > 0)
move_delay_add = max(0, move_delay_add - rand(1, 2))
/mob/living/carbon/alien/handle_changeling()
return
/mob/living/carbon/alien/handle_fire()//Aliens on fire code
if(..())
return
bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up!
return
/mob/living/carbon/alien/Life()
findQueen()
return..()
/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
return
if(!breath || (breath.total_moles() == 0))
//Aliens breathe in vaccuum
return 0
var/toxins_used = 0
var/tox_detect_threshold = 0.02
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases
breath.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
//Partial pressure of the toxins in our breath
var/Toxins_pp = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
adjustPlasma(breath_gases[/datum/gas/plasma][MOLES]*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
toxins_used = breath_gases[/datum/gas/plasma][MOLES]
else
clear_alert("alien_tox")
//Breathe in toxins and out oxygen
breath_gases[/datum/gas/plasma][MOLES] -= toxins_used
breath_gases[/datum/gas/oxygen][MOLES] += toxins_used
breath.garbage_collect()
//BREATH TEMPERATURE
handle_breath_temperature(breath)
/mob/living/carbon/alien/handle_status_effects()
..()
//natural reduction of movement delay due to stun.
if(move_delay_add > 0)
move_delay_add = max(0, move_delay_add - rand(1, 2))
/mob/living/carbon/alien/handle_changeling()
return
/mob/living/carbon/alien/handle_fire()//Aliens on fire code
if(..())
return
bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up!
return
@@ -26,7 +26,7 @@
if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
if(environment)
if(environment.total_moles())
if(environment.gases["o2"] && (environment.gases["o2"][MOLES]) >= 1) //Same threshhold that extinguishes fire
if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen][MOLES]) >= 1) //Same threshhold that extinguishes fire
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
+13 -14
View File
@@ -132,11 +132,10 @@
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases
breath.assert_gases("o2","plasma","co2","n2o", "bz")
var/O2_partialpressure = (breath_gases["o2"][MOLES]/breath.total_moles())*breath_pressure
var/Toxins_partialpressure = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure
var/CO2_partialpressure = (breath_gases["co2"][MOLES]/breath.total_moles())*breath_pressure
breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz)
var/O2_partialpressure = (breath_gases[/datum/gas/oxygen][MOLES]/breath.total_moles())*breath_pressure
var/Toxins_partialpressure = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure
var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide][MOLES]/breath.total_moles())*breath_pressure
//OXYGEN
@@ -147,7 +146,7 @@
var/ratio = 1 - O2_partialpressure/safe_oxy_min
adjustOxyLoss(min(5*ratio, 3))
failed_last_breath = 1
oxygen_used = breath_gases["o2"][MOLES]*ratio
oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]*ratio
else
adjustOxyLoss(3)
failed_last_breath = 1
@@ -157,11 +156,11 @@
failed_last_breath = 0
if(health >= HEALTH_THRESHOLD_CRIT)
adjustOxyLoss(-5)
oxygen_used = breath_gases["o2"][MOLES]
oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]
clear_alert("not_enough_oxy")
breath_gases["o2"][MOLES] -= oxygen_used
breath_gases["co2"][MOLES] += oxygen_used
breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used
breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used
//CARBON DIOXIDE
if(CO2_partialpressure > safe_co2_max)
@@ -180,15 +179,15 @@
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
var/ratio = (breath_gases["plasma"][MOLES]/safe_tox_max) * 10
var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_tox_max) * 10
adjustToxLoss(Clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
clear_alert("too_much_tox")
//NITROUS OXIDE
if(breath_gases["n2o"])
var/SA_partialpressure = (breath_gases["n2o"][MOLES]/breath.total_moles())*breath_pressure
if(breath_gases[/datum/gas/nitrous_oxide])
var/SA_partialpressure = (breath_gases[/datum/gas/nitrous_oxide][MOLES]/breath.total_moles())*breath_pressure
if(SA_partialpressure > SA_para_min)
Unconscious(60)
if(SA_partialpressure > SA_sleep_min)
@@ -198,8 +197,8 @@
emote(pick("giggle","laugh"))
//BZ (Facepunch port of their Agent B)
if(breath_gases["bz"])
var/bz_partialpressure = (breath_gases["bz"][MOLES]/breath.total_moles())*breath_pressure
if(breath_gases[/datum/gas/bz])
var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.total_moles())*breath_pressure
if(bz_partialpressure > 1)
hallucination += 20
else if(bz_partialpressure > 0.01)
+1 -3
View File
@@ -92,7 +92,7 @@
ExtinguishMob()
return
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
if(!G.gases["o2"] || G.gases["o2"][MOLES] < 1)
if(!G.gases[/datum/gas/oxygen] || G.gases[/datum/gas/oxygen][MOLES] < 1)
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
return
var/turf/location = get_turf(src)
@@ -123,5 +123,3 @@
/mob/living/proc/update_damage_hud()
return
@@ -206,7 +206,8 @@
if(A && isturf(A.loc))
var/atom/movable/AM = A
if(istype(AM, /obj/effect/decal/cleanable))
qdel(AM)
for(var/obj/effect/decal/cleanable/C in A.loc)
qdel(C)
anchored = FALSE
target = null
@@ -1,81 +1,101 @@
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
icon_state = "carp"
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 2)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
emote_taunt = list("gnashes")
taunt_chance = 30
speed = 0
maxHealth = 25
health = 25
devourable = TRUE
no_vore = FALSE
harm_intent_damage = 8
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
speak_emote = list("gnashes")
//Space carp aren't affected by cold.
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
faction = list("carp")
movement_type = FLYING
pressure_resistance = 200
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. = ..()
if(. && ishuman(target))
var/mob/living/carbon/human/H = target
H.adjustStaminaLoss(8)
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
gold_core_spawnable = 0
del_on_death = 1
/mob/living/simple_animal/hostile/carp/megacarp
icon = 'icons/mob/broadMobs.dmi'
name = "Mega Space Carp"
desc = "A ferocious, fang bearing creature that resembles a shark. This one seems especially ticked off."
icon_state = "megacarp"
icon_living = "megacarp"
icon_dead = "megacarp_dead"
icon_gib = "megacarp_gib"
maxHealth = 65
health = 65
pixel_x = -16
mob_size = MOB_SIZE_LARGE
obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
/mob/living/simple_animal/hostile/carp/cayenne
name = "Cayenne"
desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot."
gender = FEMALE
speak_emote = list("squeaks")
gold_core_spawnable = 0
faction = list("syndicate")
AIStatus = AI_OFF
#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin for megacarps (ty robustin!)
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
icon_state = "carp"
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 2)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
emote_taunt = list("gnashes")
taunt_chance = 30
speed = 0
maxHealth = 25
health = 25
harm_intent_damage = 8
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
speak_emote = list("gnashes")
//Space carp aren't affected by cold.
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
faction = list("carp")
movement_type = FLYING
pressure_resistance = 200
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. = ..()
if(. && ishuman(target))
var/mob/living/carbon/human/H = target
H.adjustStaminaLoss(8)
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
gold_core_spawnable = 0
del_on_death = 1
/mob/living/simple_animal/hostile/carp/megacarp
icon = 'icons/mob/broadMobs.dmi'
name = "Mega Space Carp"
desc = "A ferocious, fang bearing creature that resembles a shark. This one seems especially ticked off."
icon_state = "megacarp"
icon_living = "megacarp"
icon_dead = "megacarp_dead"
icon_gib = "megacarp_gib"
maxHealth = 20
health = 20
pixel_x = -16
mob_size = MOB_SIZE_LARGE
obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
var/regen_cooldown = 0
/mob/living/simple_animal/hostile/carp/megacarp/Initialize()
. = ..()
name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]"
melee_damage_lower += rand(2, 10)
melee_damage_upper += rand(10,20)
maxHealth += rand(30,60)
move_to_delay = rand(3,7)
/mob/living/simple_animal/hostile/carp/megacarp/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
/mob/living/simple_animal/hostile/carp/megacarp/Life()
. = ..()
if(regen_cooldown < world.time)
heal_overall_damage(4)
/mob/living/simple_animal/hostile/carp/cayenne
name = "Cayenne"
desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot."
gender = FEMALE
speak_emote = list("squeaks")
gold_core_spawnable = 0
faction = list("syndicate")
AIStatus = AI_OFF
#undef REGENERATION_DELAY
@@ -43,12 +43,12 @@
..()
if(isopenturf(loc))
var/turf/open/T = src.loc
if(T.air && T.air.gases["co2"])
var/co2 = T.air.gases["co2"][MOLES]
if(T.air && T.air.gases[/datum/gas/carbon_dioxide])
var/co2 = T.air.gases[/datum/gas/carbon_dioxide][MOLES]
if(co2 > 0)
if(prob(25))
var/amt = min(co2, 9)
T.air.gases["co2"][MOLES] -= amt
T.air.gases[/datum/gas/carbon_dioxide][MOLES] -= amt
T.atmos_spawn_air("o2=[amt]")
/mob/living/simple_animal/hostile/tree/AttackingTarget()
@@ -186,10 +186,10 @@
var/ST_gases = ST.air.gases
ST.air.assert_gases(arglist(GLOB.hardcoded_gases))
var/tox = ST_gases["plasma"][MOLES]
var/oxy = ST_gases["o2"][MOLES]
var/n2 = ST_gases["n2"][MOLES]
var/co2 = ST_gases["co2"][MOLES]
var/tox = ST_gases[/datum/gas/plasma][MOLES]
var/oxy = ST_gases[/datum/gas/oxygen][MOLES]
var/n2 = ST_gases[/datum/gas/nitrogen][MOLES]
var/co2 = ST_gases[/datum/gas/carbon_dioxide][MOLES]
ST.air.garbage_collect()
@@ -134,8 +134,8 @@
if(stat != DEAD)
var/bz_percentage =0
if("bz" in environment.gases)
bz_percentage = environment.gases["bz"][MOLES] / environment.total_moles()
if(environment.gases[/datum/gas/bz])
bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles()
var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis
if(stat == CONSCIOUS && stasis)
+1 -1
View File
@@ -363,7 +363,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(M.mind in SSticker.mode.changelings)
return 2
if("wizard")
if(M.mind in SSticker.mode.wizards)
if(iswizard(M))
return 2
if("apprentice")
if(M.mind in SSticker.mode.apprentices)
+4 -4
View File
@@ -31,11 +31,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/process()
if(loaded_tank)
if(!loaded_tank.air_contents.gases["plasma"])
if(!loaded_tank.air_contents.gases[/datum/gas/plasma])
investigate_log("<font color='red'>out of fuel</font>.", INVESTIGATE_SINGULO)
eject()
else
loaded_tank.air_contents.gases["plasma"][MOLES] -= 0.001*drainratio
loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= 0.001*drainratio
loaded_tank.air_contents.garbage_collect()
return
@@ -50,7 +50,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
"<span class='notice'>You turn the [src.name] [active? "on":"off"].</span>")
var/fuel
if(loaded_tank)
fuel = loaded_tank.air_contents.gases["plasma"]
fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
fuel = fuel ? fuel[MOLES] : 0
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"<font color='red'>It is empty</font>"].", INVESTIGATE_SINGULO)
return
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/proc/receive_pulse(pulse_strength)
if(loaded_tank && active)
var/power_produced = loaded_tank.air_contents.gases["plasma"] ? loaded_tank.air_contents.gases["plasma"][MOLES] : 0
var/power_produced = loaded_tank.air_contents.gases[/datum/gas/plasma] ? loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] : 0
power_produced *= pulse_strength*10
add_avail(power_produced)
last_power = power_produced
+10 -10
View File
@@ -284,17 +284,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(damage > damage_archived && prob(10))
playsound(get_turf(src), 'sound/effects/empulse.ogg', 50, 1)
removed.assert_gases("o2", "plasma", "co2", "n2o", "n2", "freon")
removed.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/nitrogen, /datum/gas/freon)
//calculating gas related values
combined_gas = max(removed.total_moles(), 0)
plasmacomp = max(removed.gases["plasma"][MOLES]/combined_gas, 0)
o2comp = max(removed.gases["o2"][MOLES]/combined_gas, 0)
co2comp = max(removed.gases["co2"][MOLES]/combined_gas, 0)
plasmacomp = max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0)
o2comp = max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0)
co2comp = max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0)
n2ocomp = max(removed.gases["n2o"][MOLES]/combined_gas, 0)
n2comp = max(removed.gases["n2"][MOLES]/combined_gas, 0)
freoncomp = max(removed.gases["freon"][MOLES]/combined_gas, 0)
n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0)
n2comp = max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0)
freoncomp = max(removed.gases[/datum/gas/freon][MOLES]/combined_gas, 0)
gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp - freoncomp, 0), 1)
@@ -348,12 +348,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
removed.temperature = max(0, min(removed.temperature, 2500 * dynamic_heat_modifier))
//Calculate how much gas to release
removed.gases["plasma"][MOLES] += max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)
removed.gases[/datum/gas/plasma][MOLES] += max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)
removed.gases["o2"][MOLES] += max(((device_energy + removed.temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
removed.gases[/datum/gas/oxygen][MOLES] += max(((device_energy + removed.temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
if(combined_gas < 50)
removed.gases["freon"][MOLES] = max((removed.gases["freon"][MOLES] + device_energy) * freoncomp / FREON_BREEDING_MODIFIER, 0)
removed.gases[/datum/gas/freon][MOLES] = max((removed.gases[/datum/gas/freon][MOLES] + device_energy) * freoncomp / FREON_BREEDING_MODIFIER, 0)
if(produces_gas)
env.merge(removed)
+221 -219
View File
@@ -1,219 +1,221 @@
//In this file: Summon Magic/Summon Guns/Summon Events
/proc/rightandwrong(summon_type, mob/user, survivor_probability) //0 = Summon Guns, 1 = Summon Magic
var/list/gunslist = list("taser","gravgun","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi","alienpistol","dragnet","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","bulldog","grenadelauncher","goldenrevolver","sniper","medibeam","scatterbeam")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor","voodoo", "whistle", "battlemage", "immortality", "ghostsword", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic", "bloodcontract")
if(user) //in this case either someone holding a spellbook or a badmin
to_chat(user, "<B>You summoned [summon_type ? "magic" : "guns"]!</B>")
message_admins("[key_name_admin(user, 1)] summoned [summon_type ? "magic" : "guns"]!")
log_game("[key_name(user)] summoned [summon_type ? "magic" : "guns"]!")
for(var/mob/living/carbon/human/H in GLOB.player_list)
if(H.stat == DEAD || !(H.client)) continue
if(H.mind)
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice" || H.mind.special_role == "survivalist") continue
if(prob(survivor_probability) && !(H.mind in SSticker.mode.traitors))
SSticker.mode.traitors += H.mind
if(!summon_type)
var/datum/objective/steal_five_of_type/summon_guns/guns = new
guns.owner = H.mind
H.mind.objectives += guns
H.mind.special_role = "survivalist"
to_chat(H, "<B>You are the survivalist! Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way.</B>")
else
var/datum/objective/steal_five_of_type/summon_magic/magic = new
magic.owner = H.mind
H.mind.objectives += magic
H.mind.special_role = "amateur magician"
to_chat(H, "<B>You are the amateur magician! Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way.</B>")
var/datum/objective/survive/survive = new
survive.owner = H.mind
H.mind.objectives += survive
H.log_message("<font color='red'>Was made into a survivalist, and trusts no one!</font>", INDIVIDUAL_ATTACK_LOG)
H.mind.announce_objectives()
var/randomizeguns = pick(gunslist)
var/randomizemagic = pick(magiclist)
var/randomizemagicspecial = pick(magicspeciallist)
if(!summon_type)
var/obj/item/gun/G
switch (randomizeguns)
if("taser")
G = new /obj/item/gun/energy/e_gun/advtaser(get_turf(H))
if("egun")
G = new /obj/item/gun/energy/e_gun(get_turf(H))
if("laser")
G = new /obj/item/gun/energy/laser(get_turf(H))
if("revolver")
G = new /obj/item/gun/ballistic/revolver(get_turf(H))
if("detective")
G = new /obj/item/gun/ballistic/revolver/detective(get_turf(H))
if("deagle")
G = new /obj/item/gun/ballistic/automatic/pistol/deagle/camo(get_turf(H))
if("gyrojet")
G = new /obj/item/gun/ballistic/automatic/gyropistol(get_turf(H))
if("pulse")
G = new /obj/item/gun/energy/pulse(get_turf(H))
if("suppressed")
G = new /obj/item/gun/ballistic/automatic/pistol(get_turf(H))
new /obj/item/suppressor(get_turf(H))
if("doublebarrel")
G = new /obj/item/gun/ballistic/revolver/doublebarrel(get_turf(H))
if("shotgun")
G = new /obj/item/gun/ballistic/shotgun(get_turf(H))
if("combatshotgun")
G = new /obj/item/gun/ballistic/shotgun/automatic/combat(get_turf(H))
if("arg")
G = new /obj/item/gun/ballistic/automatic/ar(get_turf(H))
if("mateba")
G = new /obj/item/gun/ballistic/revolver/mateba(get_turf(H))
if("boltaction")
G = new /obj/item/gun/ballistic/shotgun/boltaction(get_turf(H))
if("speargun")
G = new /obj/item/gun/ballistic/automatic/speargun(get_turf(H))
if("uzi")
G = new /obj/item/gun/ballistic/automatic/mini_uzi(get_turf(H))
if("cannon")
G = new /obj/item/gun/energy/lasercannon(get_turf(H))
if("crossbow")
G = new /obj/item/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H))
if("nuclear")
G = new /obj/item/gun/energy/e_gun/nuclear(get_turf(H))
if("sabr")
G = new /obj/item/gun/ballistic/automatic/proto(get_turf(H))
if("bulldog")
G = new /obj/item/gun/ballistic/automatic/shotgun/bulldog(get_turf(H))
if("c20r")
G = new /obj/item/gun/ballistic/automatic/c20r(get_turf(H))
if("saw")
G = new /obj/item/gun/ballistic/automatic/l6_saw(get_turf(H))
if("car")
G = new /obj/item/gun/ballistic/automatic/m90(get_turf(H))
if("alienpistol")
G = new /obj/item/gun/energy/alien(get_turf(H))
if("dragnet")
G = new /obj/item/gun/energy/e_gun/dragnet(get_turf(H))
if("turret")
G = new /obj/item/gun/energy/e_gun/turret(get_turf(H))
if("pulsecarbine")
G = new /obj/item/gun/energy/pulse/carbine(get_turf(H))
if("decloner")
G = new /obj/item/gun/energy/decloner(get_turf(H))
if("mindflayer")
G = new /obj/item/gun/energy/mindflayer(get_turf(H))
if("hyperkinetic")
G = new /obj/item/gun/energy/kinetic_accelerator(get_turf(H))
if("advplasmacutter")
G = new /obj/item/gun/energy/plasmacutter/adv(get_turf(H))
if("wormhole")
G = new /obj/item/gun/energy/wormhole_projector(get_turf(H))
if("wt550")
G = new /obj/item/gun/ballistic/automatic/wt550(get_turf(H))
if("bulldog")
G = new /obj/item/gun/ballistic/automatic/shotgun(get_turf(H))
if("grenadelauncher")
G = new /obj/item/gun/ballistic/revolver/grenadelauncher(get_turf(H))
if("goldenrevolver")
G = new /obj/item/gun/ballistic/revolver/golden(get_turf(H))
if("sniper")
G = new /obj/item/gun/ballistic/automatic/sniper_rifle(get_turf(H))
if("medibeam")
G = new /obj/item/gun/medbeam(get_turf(H))
if("scatterbeam")
G = new /obj/item/gun/energy/laser/scatter(get_turf(H))
if("gravgun")
G = new /obj/item/gun/energy/gravity_gun(get_turf(H))
G.unlock()
playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, 1)
else
switch (randomizemagic)
if("fireball")
new /obj/item/spellbook/oneuse/fireball(get_turf(H))
if("smoke")
new /obj/item/spellbook/oneuse/smoke(get_turf(H))
if("blind")
new /obj/item/spellbook/oneuse/blind(get_turf(H))
if("mindswap")
new /obj/item/spellbook/oneuse/mindswap(get_turf(H))
if("forcewall")
new /obj/item/spellbook/oneuse/forcewall(get_turf(H))
if("knock")
new /obj/item/spellbook/oneuse/knock(get_turf(H))
if("horsemask")
new /obj/item/spellbook/oneuse/barnyard(get_turf(H))
if("charge")
new /obj/item/spellbook/oneuse/charge(get_turf(H))
if("summonitem")
new /obj/item/spellbook/oneuse/summonitem(get_turf(H))
if("wandnothing")
new /obj/item/gun/magic/wand(get_turf(H))
if("wanddeath")
new /obj/item/gun/magic/wand/death(get_turf(H))
if("wandresurrection")
new /obj/item/gun/magic/wand/resurrection(get_turf(H))
if("wandpolymorph")
new /obj/item/gun/magic/wand/polymorph(get_turf(H))
if("wandteleport")
new /obj/item/gun/magic/wand/teleport(get_turf(H))
if("wanddoor")
new /obj/item/gun/magic/wand/door(get_turf(H))
if("wandfireball")
new /obj/item/gun/magic/wand/fireball(get_turf(H))
if("staffhealing")
new /obj/item/gun/magic/staff/healing(get_turf(H))
if("staffdoor")
new /obj/item/gun/magic/staff/door(get_turf(H))
if("armor")
new /obj/item/clothing/suit/space/hardsuit/wizard(get_turf(H))
if("scrying")
new /obj/item/scrying(get_turf(H))
if (!(H.dna.check_mutation(XRAY)))
H.dna.add_mutation(XRAY)
to_chat(H, "<span class='notice'>The walls suddenly disappear.</span>")
if("voodoo")
new /obj/item/voodoo(get_turf(H))
if("whistle")
new /obj/item/warpwhistle(get_turf(H))
if("battlemage")
new /obj/item/clothing/suit/space/hardsuit/shielded/wizard(get_turf(H))
if("immortality")
new /obj/item/device/immortality_talisman(get_turf(H))
if("ghostsword")
new /obj/item/melee/ghost_sword(get_turf(H))
if("special")
magiclist -= "special" //only one super OP item per summoning max
switch (randomizemagicspecial)
if("staffchange")
new /obj/item/gun/magic/staff/change(get_turf(H))
if("staffanimation")
new /obj/item/gun/magic/staff/animate(get_turf(H))
if("wandbelt")
new /obj/item/storage/belt/wands/full(get_turf(H))
if("contract")
new /obj/item/antag_spawner/contract(get_turf(H))
if("staffchaos")
new /obj/item/gun/magic/staff/chaos(get_turf(H))
if("necromantic")
new /obj/item/device/necromantic_stone(get_turf(H))
if("bloodcontract")
new /obj/item/blood_contract(get_turf(H))
to_chat(H, "<span class='notice'>You suddenly feel lucky.</span>")
playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, 1)
/proc/summonevents()
if(!SSevents.wizardmode)
SSevents.frequency_lower = 600 //1 minute lower bound
SSevents.frequency_upper = 3000 //5 minutes upper bound
SSevents.toggleWizardmode()
SSevents.reschedule()
else //Speed it up
SSevents.frequency_upper -= 600 //The upper bound falls a minute each time, making the AVERAGE time between events lessen
if(SSevents.frequency_upper < SSevents.frequency_lower) //Sanity
SSevents.frequency_upper = SSevents.frequency_lower
SSevents.reschedule()
message_admins("Summon Events intensifies, events will now occur every [SSevents.frequency_lower / 600] to [SSevents.frequency_upper / 600] minutes.")
log_game("Summon Events was increased!")
//In this file: Summon Magic/Summon Guns/Summon Events
/proc/rightandwrong(summon_type, mob/user, survivor_probability) //0 = Summon Guns, 1 = Summon Magic
var/list/gunslist = list("taser","gravgun","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi","alienpistol","dragnet","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","bulldog","grenadelauncher","goldenrevolver","sniper","medibeam","scatterbeam")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor","voodoo", "whistle", "battlemage", "immortality", "ghostsword", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic", "bloodcontract")
if(user) //in this case either someone holding a spellbook or a badmin
to_chat(user, "<B>You summoned [summon_type ? "magic" : "guns"]!</B>")
message_admins("[key_name_admin(user, 1)] summoned [summon_type ? "magic" : "guns"]!")
log_game("[key_name(user)] summoned [summon_type ? "magic" : "guns"]!")
for(var/mob/living/carbon/human/H in GLOB.player_list)
if(H.stat == DEAD || !(H.client))
continue
if(H.mind)
if(iswizard(H) || H.mind.special_role == "survivalist")
continue
if(prob(survivor_probability) && !(H.mind in SSticker.mode.traitors))
SSticker.mode.traitors += H.mind
if(!summon_type)
var/datum/objective/steal_five_of_type/summon_guns/guns = new
guns.owner = H.mind
H.mind.objectives += guns
H.mind.special_role = "survivalist"
to_chat(H, "<B>You are the survivalist! Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way.</B>")
else
var/datum/objective/steal_five_of_type/summon_magic/magic = new
magic.owner = H.mind
H.mind.objectives += magic
H.mind.special_role = "amateur magician"
to_chat(H, "<B>You are the amateur magician! Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way.</B>")
var/datum/objective/survive/survive = new
survive.owner = H.mind
H.mind.objectives += survive
H.log_message("<font color='red'>Was made into a survivalist, and trusts no one!</font>", INDIVIDUAL_ATTACK_LOG)
H.mind.announce_objectives()
var/randomizeguns = pick(gunslist)
var/randomizemagic = pick(magiclist)
var/randomizemagicspecial = pick(magicspeciallist)
if(!summon_type)
var/obj/item/gun/G
switch (randomizeguns)
if("taser")
G = new /obj/item/gun/energy/e_gun/advtaser(get_turf(H))
if("egun")
G = new /obj/item/gun/energy/e_gun(get_turf(H))
if("laser")
G = new /obj/item/gun/energy/laser(get_turf(H))
if("revolver")
G = new /obj/item/gun/ballistic/revolver(get_turf(H))
if("detective")
G = new /obj/item/gun/ballistic/revolver/detective(get_turf(H))
if("deagle")
G = new /obj/item/gun/ballistic/automatic/pistol/deagle/camo(get_turf(H))
if("gyrojet")
G = new /obj/item/gun/ballistic/automatic/gyropistol(get_turf(H))
if("pulse")
G = new /obj/item/gun/energy/pulse(get_turf(H))
if("suppressed")
G = new /obj/item/gun/ballistic/automatic/pistol(get_turf(H))
new /obj/item/suppressor(get_turf(H))
if("doublebarrel")
G = new /obj/item/gun/ballistic/revolver/doublebarrel(get_turf(H))
if("shotgun")
G = new /obj/item/gun/ballistic/shotgun(get_turf(H))
if("combatshotgun")
G = new /obj/item/gun/ballistic/shotgun/automatic/combat(get_turf(H))
if("arg")
G = new /obj/item/gun/ballistic/automatic/ar(get_turf(H))
if("mateba")
G = new /obj/item/gun/ballistic/revolver/mateba(get_turf(H))
if("boltaction")
G = new /obj/item/gun/ballistic/shotgun/boltaction(get_turf(H))
if("speargun")
G = new /obj/item/gun/ballistic/automatic/speargun(get_turf(H))
if("uzi")
G = new /obj/item/gun/ballistic/automatic/mini_uzi(get_turf(H))
if("cannon")
G = new /obj/item/gun/energy/lasercannon(get_turf(H))
if("crossbow")
G = new /obj/item/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H))
if("nuclear")
G = new /obj/item/gun/energy/e_gun/nuclear(get_turf(H))
if("sabr")
G = new /obj/item/gun/ballistic/automatic/proto(get_turf(H))
if("bulldog")
G = new /obj/item/gun/ballistic/automatic/shotgun/bulldog(get_turf(H))
if("c20r")
G = new /obj/item/gun/ballistic/automatic/c20r(get_turf(H))
if("saw")
G = new /obj/item/gun/ballistic/automatic/l6_saw(get_turf(H))
if("car")
G = new /obj/item/gun/ballistic/automatic/m90(get_turf(H))
if("alienpistol")
G = new /obj/item/gun/energy/alien(get_turf(H))
if("dragnet")
G = new /obj/item/gun/energy/e_gun/dragnet(get_turf(H))
if("turret")
G = new /obj/item/gun/energy/e_gun/turret(get_turf(H))
if("pulsecarbine")
G = new /obj/item/gun/energy/pulse/carbine(get_turf(H))
if("decloner")
G = new /obj/item/gun/energy/decloner(get_turf(H))
if("mindflayer")
G = new /obj/item/gun/energy/mindflayer(get_turf(H))
if("hyperkinetic")
G = new /obj/item/gun/energy/kinetic_accelerator(get_turf(H))
if("advplasmacutter")
G = new /obj/item/gun/energy/plasmacutter/adv(get_turf(H))
if("wormhole")
G = new /obj/item/gun/energy/wormhole_projector(get_turf(H))
if("wt550")
G = new /obj/item/gun/ballistic/automatic/wt550(get_turf(H))
if("bulldog")
G = new /obj/item/gun/ballistic/automatic/shotgun(get_turf(H))
if("grenadelauncher")
G = new /obj/item/gun/ballistic/revolver/grenadelauncher(get_turf(H))
if("goldenrevolver")
G = new /obj/item/gun/ballistic/revolver/golden(get_turf(H))
if("sniper")
G = new /obj/item/gun/ballistic/automatic/sniper_rifle(get_turf(H))
if("medibeam")
G = new /obj/item/gun/medbeam(get_turf(H))
if("scatterbeam")
G = new /obj/item/gun/energy/laser/scatter(get_turf(H))
if("gravgun")
G = new /obj/item/gun/energy/gravity_gun(get_turf(H))
G.unlock()
playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, 1)
else
switch (randomizemagic)
if("fireball")
new /obj/item/spellbook/oneuse/fireball(get_turf(H))
if("smoke")
new /obj/item/spellbook/oneuse/smoke(get_turf(H))
if("blind")
new /obj/item/spellbook/oneuse/blind(get_turf(H))
if("mindswap")
new /obj/item/spellbook/oneuse/mindswap(get_turf(H))
if("forcewall")
new /obj/item/spellbook/oneuse/forcewall(get_turf(H))
if("knock")
new /obj/item/spellbook/oneuse/knock(get_turf(H))
if("horsemask")
new /obj/item/spellbook/oneuse/barnyard(get_turf(H))
if("charge")
new /obj/item/spellbook/oneuse/charge(get_turf(H))
if("summonitem")
new /obj/item/spellbook/oneuse/summonitem(get_turf(H))
if("wandnothing")
new /obj/item/gun/magic/wand(get_turf(H))
if("wanddeath")
new /obj/item/gun/magic/wand/death(get_turf(H))
if("wandresurrection")
new /obj/item/gun/magic/wand/resurrection(get_turf(H))
if("wandpolymorph")
new /obj/item/gun/magic/wand/polymorph(get_turf(H))
if("wandteleport")
new /obj/item/gun/magic/wand/teleport(get_turf(H))
if("wanddoor")
new /obj/item/gun/magic/wand/door(get_turf(H))
if("wandfireball")
new /obj/item/gun/magic/wand/fireball(get_turf(H))
if("staffhealing")
new /obj/item/gun/magic/staff/healing(get_turf(H))
if("staffdoor")
new /obj/item/gun/magic/staff/door(get_turf(H))
if("armor")
new /obj/item/clothing/suit/space/hardsuit/wizard(get_turf(H))
if("scrying")
new /obj/item/scrying(get_turf(H))
if (!(H.dna.check_mutation(XRAY)))
H.dna.add_mutation(XRAY)
to_chat(H, "<span class='notice'>The walls suddenly disappear.</span>")
if("voodoo")
new /obj/item/voodoo(get_turf(H))
if("whistle")
new /obj/item/warpwhistle(get_turf(H))
if("battlemage")
new /obj/item/clothing/suit/space/hardsuit/shielded/wizard(get_turf(H))
if("immortality")
new /obj/item/device/immortality_talisman(get_turf(H))
if("ghostsword")
new /obj/item/melee/ghost_sword(get_turf(H))
if("special")
magiclist -= "special" //only one super OP item per summoning max
switch (randomizemagicspecial)
if("staffchange")
new /obj/item/gun/magic/staff/change(get_turf(H))
if("staffanimation")
new /obj/item/gun/magic/staff/animate(get_turf(H))
if("wandbelt")
new /obj/item/storage/belt/wands/full(get_turf(H))
if("contract")
new /obj/item/antag_spawner/contract(get_turf(H))
if("staffchaos")
new /obj/item/gun/magic/staff/chaos(get_turf(H))
if("necromantic")
new /obj/item/device/necromantic_stone(get_turf(H))
if("bloodcontract")
new /obj/item/blood_contract(get_turf(H))
to_chat(H, "<span class='notice'>You suddenly feel lucky.</span>")
playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, 1)
/proc/summonevents()
if(!SSevents.wizardmode)
SSevents.frequency_lower = 600 //1 minute lower bound
SSevents.frequency_upper = 3000 //5 minutes upper bound
SSevents.toggleWizardmode()
SSevents.reschedule()
else //Speed it up
SSevents.frequency_upper -= 600 //The upper bound falls a minute each time, making the AVERAGE time between events lessen
if(SSevents.frequency_upper < SSevents.frequency_lower) //Sanity
SSevents.frequency_upper = SSevents.frequency_lower
SSevents.reschedule()
message_admins("Summon Events intensifies, events will now occur every [SSevents.frequency_lower / 600] to [SSevents.frequency_upper / 600] minutes.")
log_game("Summon Events was increased!")
+26 -26
View File
@@ -95,13 +95,13 @@
var/list/breath_gases = breath.gases
breath.assert_gases("o2", "n2", "plasma", "co2", "n2o", "bz")
breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitrogen)
//Partial pressures in our breath
var/O2_pp = breath.get_breath_partial_pressure(breath_gases["o2"][MOLES])
var/N2_pp = breath.get_breath_partial_pressure(breath_gases["n2"][MOLES])
var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases["plasma"][MOLES])
var/CO2_pp = breath.get_breath_partial_pressure(breath_gases["co2"][MOLES])
var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES])
var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES])
var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES])
var/CO2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES])
//-- OXY --//
@@ -109,7 +109,7 @@
//Too much oxygen! //Yes, some species may not like it.
if(safe_oxygen_max)
if(O2_pp > safe_oxygen_max)
var/ratio = (breath_gases["o2"][MOLES]/safe_oxygen_max) * 10
var/ratio = (breath_gases[/datum/gas/oxygen][MOLES]/safe_oxygen_max) * 10
H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
else
@@ -118,18 +118,18 @@
//Too little oxygen!
if(safe_oxygen_min)
if(O2_pp < safe_oxygen_min)
gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath_gases["o2"][MOLES])
gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath_gases[/datum/gas/oxygen][MOLES])
H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else
H.failed_last_breath = FALSE
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(-5)
gas_breathed = breath_gases["o2"][MOLES]
gas_breathed = breath_gases[/datum/gas/oxygen][MOLES]
H.clear_alert("not_enough_oxy")
//Exhale
breath_gases["o2"][MOLES] -= gas_breathed
breath_gases["co2"][MOLES] += gas_breathed
breath_gases[/datum/gas/oxygen][MOLES] -= gas_breathed
breath_gases[/datum/gas/carbon_dioxide][MOLES] += gas_breathed
gas_breathed = 0
//-- Nitrogen --//
@@ -137,7 +137,7 @@
//Too much nitrogen!
if(safe_nitro_max)
if(N2_pp > safe_nitro_max)
var/ratio = (breath_gases["n2"][MOLES]/safe_nitro_max) * 10
var/ratio = (breath_gases[/datum/gas/nitrogen][MOLES]/safe_nitro_max) * 10
H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
else
@@ -146,18 +146,18 @@
//Too little nitrogen!
if(safe_nitro_min)
if(N2_pp < safe_nitro_min)
gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath_gases["n2"][MOLES])
gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath_gases[/datum/gas/nitrogen][MOLES])
H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
else
H.failed_last_breath = FALSE
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(-5)
gas_breathed = breath_gases["n2"][MOLES]
gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES]
H.clear_alert("nitro")
//Exhale
breath_gases["n2"][MOLES] -= gas_breathed
breath_gases["co2"][MOLES] += gas_breathed
breath_gases[/datum/gas/nitrogen][MOLES] -= gas_breathed
breath_gases[/datum/gas/carbon_dioxide][MOLES] += gas_breathed
gas_breathed = 0
//-- CO2 --//
@@ -183,18 +183,18 @@
//Too little CO2!
if(safe_co2_min)
if(CO2_pp < safe_co2_min)
gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath_gases["co2"][MOLES])
gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath_gases[/datum/gas/carbon_dioxide][MOLES])
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
else
H.failed_last_breath = FALSE
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(-5)
gas_breathed = breath_gases["co2"][MOLES]
gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES]
H.clear_alert("not_enough_co2")
//Exhale
breath_gases["co2"][MOLES] -= gas_breathed
breath_gases["o2"][MOLES] += gas_breathed
breath_gases[/datum/gas/carbon_dioxide][MOLES] -= gas_breathed
breath_gases[/datum/gas/oxygen][MOLES] += gas_breathed
gas_breathed = 0
@@ -203,7 +203,7 @@
//Too much toxins!
if(safe_toxins_max)
if(Toxins_pp > safe_toxins_max)
var/ratio = (breath_gases["plasma"][MOLES]/safe_toxins_max) * 10
var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_toxins_max) * 10
H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
@@ -213,18 +213,18 @@
//Too little toxins!
if(safe_toxins_min)
if(Toxins_pp < safe_toxins_min)
gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath_gases["plasma"][MOLES])
gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath_gases[/datum/gas/plasma][MOLES])
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else
H.failed_last_breath = FALSE
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(-5)
gas_breathed = breath_gases["plasma"][MOLES]
gas_breathed = breath_gases[/datum/gas/plasma][MOLES]
H.clear_alert("not_enough_tox")
//Exhale
breath_gases["plasma"][MOLES] -= gas_breathed
breath_gases["co2"][MOLES] += gas_breathed
breath_gases[/datum/gas/plasma][MOLES] -= gas_breathed
breath_gases[/datum/gas/carbon_dioxide][MOLES] += gas_breathed
gas_breathed = 0
@@ -234,7 +234,7 @@
// N2O
var/SA_pp = breath.get_breath_partial_pressure(breath_gases["n2o"][MOLES])
var/SA_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrous_oxide][MOLES])
if(SA_pp > SA_para_min) // Enough to make us stunned for a bit
H.Unconscious(60) // 60 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
@@ -245,7 +245,7 @@
// BZ
var/bz_pp = breath.get_breath_partial_pressure(breath_gases["bz"][MOLES])
var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES])
if(bz_pp > BZ_trip_balls_min)
H.hallucination += 20
if(prob(33))
@@ -0,0 +1,4 @@
author: "More Robust Than You"
delete-after: True
changes:
- tweak: "Jungle Fever carriers now hear the proper antag sound"
@@ -0,0 +1,6 @@
author: "deathride58"
delete-after: True
changes:
- tweak: "The game will no longer take 2-3 minutes to start up during highpop. Hooray optimization!"
- tweak: "Miscreants now have a 5% chance of being generated instead of a 2% chance."
- tweak: "Crew objective display at the end of the round is now a lot more compact."
@@ -0,0 +1,4 @@
author: "Xhuis"
delete-after: True
changes:
- tweak: "Cogscarabs can now experiment more freely with base design during non-clockcult rounds with infinite power and the ability to recite scripture!"
@@ -0,0 +1,4 @@
author: "Mercenaryblue"
delete-after: True
changes:
- imageadd: "added some in_hands for banana peels."
@@ -0,0 +1,4 @@
author: "DaxDupont"
delete-after: True
changes:
- tweak: "After lobbying by Robust Softdrinks and Getmore Chocolate Corp all vendor firmware has been changed to add sillicons to their target demographic."
@@ -0,0 +1,35 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: "Bawhoppen"
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
- tweak: "Smoke machine board has been moved to tech storage."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

+79
View File
@@ -0,0 +1,79 @@
Legendary
Epic
Rare
Common
Elusive
Lackluster
Bloody
Strange
Unremarkable
Scarcely Lethal
Mildly Menacing
Truly Feared
Wicked
Nasty
Normal
Unique
Vintage
Genuine
Unusual
Haunted
Big
Small
The
Savage
Hungry
Sated
Despicable
Nice
Helpful
Rogue
Spotted
Deep Blue
Quick
Slow
Beloved
Agressive
Angry
Bewildered
Clumsy
Defeated
Grumpy
Itchy
Scratchy
Lazy
Mysterious
Repulsive
Thoughtless
Broad
Chubby
Crooked
Curved
Deep
Flat
High
Hollow
Low
Narrow
Round
Shallow
Robust
Skinny
Square Nose
Steep Nose
Renegade
Ancient
Old
Fast
Brief
Short
Frustratingly Elusive
Curvy
Fitted
Forked
Rugged
Sinuous
Slimy
Sweeping
Twisted
Crooked
+54
View File
@@ -0,0 +1,54 @@
Laser Shark
Hammerhead Shark
Wobbegong Shark
Smooth-Hound Shark
Thresher Shark
Sand Shark
Mackerel Shark
Sawshark
Angel Shark
Cat Shark
Space Shark
Cow Shark
Goblin Shark
Ghast Shark
Ghost Shark
Nightmare Shark
Sharkling
Sharknado
Megalodon
Minilodon
Dog Shark
Moby Dick
Flipper Shark
Space Kraken
Great White Shark
Asteroid Shark
Meteor Shark
Derelict Shark
Lava Shark
Whale Shark
Traitor Shark
Magishark
Chaos Shark
Incinerator Shark
Shredder Shark
Shawshark
Judicator Shark
Snapjaw Shark
Bloodhound Shark
Vermin Shark
Chomper Shark
Megalomaniac Shark
Frog Shark
Buffalo Shark
Lizard Shark
Pulse Shark
Baby Gargantuan Shark
Flying Shark
Spacetime Shark
Freon Shark
Plasma Shark
Guru Shark
Toxic Shark
Spider Shark
+2
View File
@@ -291,6 +291,7 @@
#include "code\datums\soullink.dm"
#include "code\datums\spawners_menu.dm"
#include "code\datums\verbs.dm"
#include "code\datums\world_topic.dm"
#include "code\datums\antagonists\antag_datum.dm"
#include "code\datums\antagonists\datum_abductor.dm"
#include "code\datums\antagonists\datum_brother.dm"
@@ -300,6 +301,7 @@
#include "code\datums\antagonists\datum_traitor.dm"
#include "code\datums\antagonists\devil.dm"
#include "code\datums\antagonists\ninja.dm"
#include "code\datums\antagonists\wizard.dm"
#include "code\datums\components\_component.dm"
#include "code\datums\components\archaeology.dm"
#include "code\datums\components\infective.dm"
+1 -1
View File
File diff suppressed because one or more lines are too long