Merge remote-tracking branch 'refs/remotes/ParadiseSS13/master' into logic

This commit is contained in:
FalseIncarnate
2016-04-05 19:15:11 -04:00
434 changed files with 16507 additions and 12215 deletions
+38
View File
@@ -0,0 +1,38 @@
//Bot defines, placed here so they can be read by other things!
#define BOT_STEP_DELAY 4 //Delay between movemements
#define BOT_STEP_MAX_RETRIES 5 //Maximum times a bot will retry to step from its position
#define DEFAULT_SCAN_RANGE 7 //default view range for finding targets.
//Mode defines
#define BOT_IDLE 0 // idle
#define BOT_HUNT 1 // found target, hunting
#define BOT_PREP_ARREST 2 // at target, preparing to arrest
#define BOT_ARREST 3 // arresting target
#define BOT_START_PATROL 4 // start patrol
#define BOT_PATROL 5 // patrolling
#define BOT_SUMMON 6 // summoned by PDA
#define BOT_CLEANING 7 // cleaning (cleanbots)
#define BOT_REPAIRING 8 // repairing hull breaches (floorbots)
#define BOT_MOVING 9 // for clean/floor/med bots, when moving.
#define BOT_HEALING 10 // healing people (medbots)
#define BOT_RESPONDING 11 // responding to a call from the AI
#define BOT_DELIVER 12 // moving to deliver
#define BOT_GO_HOME 13 // returning to home
#define BOT_BLOCKED 14 // blocked
#define BOT_NAV 15 // computing navigation
#define BOT_WAIT_FOR_NAV 16 // waiting for nav computation
#define BOT_NO_ROUTE 17 // no destination beacon found (or no route)
//Bot types
#define SEC_BOT 1 // Secutritrons (Beepsky) and ED-209s
#define MULE_BOT 2 // MULEbots
#define FLOOR_BOT 4 // Floorbots
#define CLEAN_BOT 8 // Cleanbots
#define MED_BOT 16 // Medibots
//Sentience types
#define SENTIENCE_ORGANIC 1
#define SENTIENCE_ARTIFICIAL 2
#define SENTIENCE_OTHER 3
+1
View File
@@ -49,6 +49,7 @@
#define NO_INTORGANS 4096
#define NO_POISON 8192
#define RADIMMUNE 16384
#define ALL_RPARTS 32768
//Species clothing flags
#define HAS_UNDERWEAR 1
+9
View File
@@ -112,3 +112,12 @@
#define BLIND 1
#define MUTE 2
#define DEAF 4
//Nutrition levels for humans. No idea where else to put it
#define NUTRITION_LEVEL_FAT 600
#define NUTRITION_LEVEL_FULL 550
#define NUTRITION_LEVEL_WELL_FED 450
#define NUTRITION_LEVEL_FED 350
#define NUTRITION_LEVEL_HUNGRY 250
#define NUTRITION_LEVEL_STARVING 150
+2 -1
View File
@@ -14,7 +14,8 @@
#define DIAG_HUD "9" // Silicon health bar
#define DIAG_BATT_HUD "10"// Borg/Mech power meter
#define DIAG_MECH_HUD "11"// Mech health bar
#define STATUS_HUD_OOC "12" // STATUS_HUD without virus db check for someone being ill.
#define STATUS_HUD_OOC "12"// STATUS_HUD without virus db check for someone being ill.
#define DIAG_BOT_HUD "13"// Bot HUDS
//for antag huds. these are used at the /mob level
#define SPECIALROLE_HUD "13"
+8 -1
View File
@@ -180,4 +180,11 @@
#define TURF_DRY 0
#define TURF_WET_WATER 1
#define TURF_WET_LUBE 2
#define TURF_WET_ICE 3
#define TURF_WET_ICE 3
#define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA
// Metal foam states
// teehee no one will find these here
#define MFOAM_ALUMINUM 1
#define MFOAM_IRON 2
+15
View File
@@ -32,6 +32,21 @@
return A
return 0
/proc/get_areas_in_range(dist=0, atom/center=usr)
if(!dist)
var/turf/T = get_turf(center)
return T ? list(T.loc) : list()
if(!center)
return list()
var/list/turfs = RANGE_TURFS(dist, center)
var/list/areas = list()
for(var/V in turfs)
var/turf/T = V
areas |= T.loc
return areas
/proc/in_range(source, user)
if(get_dist(source, user) <= 1)
return 1
+95
View File
@@ -46,6 +46,7 @@ proc/random_hair_style(var/gender, species = "Human")
continue
if( !(species in S.species_allowed))
continue
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
if(valid_hairstyles.len)
@@ -161,3 +162,97 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
if(!admin) return
msg_admin_attack("[key_name_admin(user)] [what_done] [key_name_admin(target)][object ? " with [object]" : " "][addition]")
/proc/do_mob(var/mob/user, var/mob/target, var/time = 30, var/uninterruptible = 0, progress = 1)
if(!user || !target)
return 0
var/user_loc = user.loc
var/drifting = 0
if(!user.Process_Spacemove(0) && user.inertia_dir)
drifting = 1
var/target_loc = target.loc
var/holding = user.get_active_hand()
var/datum/progressbar/progbar
if (progress)
progbar = new(user, time, target)
var/endtime = world.time+time
var/starttime = world.time
. = 1
while (world.time < endtime)
sleep(1)
if (progress)
progbar.update(world.time - starttime)
if(!user || !target)
. = 0
break
if(uninterruptible)
continue
if(drifting && !user.inertia_dir)
drifting = 0
user_loc = user.loc
if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying )
. = 0
break
if (progress)
qdel(progbar)
/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1)
if(!user)
return 0
var/atom/Tloc = null
if(target)
Tloc = target.loc
var/atom/Uloc = user.loc
var/drifting = 0
if(!user.Process_Spacemove(0) && user.inertia_dir)
drifting = 1
var/holding = user.get_active_hand()
var/holdingnull = 1 //User's hand started out empty, check for an empty hand
if(holding)
holdingnull = 0 //Users hand started holding something, check to see if it's still holding that
var/datum/progressbar/progbar
if (progress)
progbar = new(user, delay, target)
var/endtime = world.time + delay
var/starttime = world.time
. = 1
while (world.time < endtime)
sleep(1)
if (progress)
progbar.update(world.time - starttime)
if(drifting && !user.inertia_dir)
drifting = 0
Uloc = user.loc
if(!user || user.stat || user.weakened || user.stunned || (!drifting && user.loc != Uloc))
. = 0
break
if(Tloc && (!target || Tloc != target.loc))
. = 0
break
if(needhand)
//This might seem like an odd check, but you can still need a hand even when it's empty
//i.e the hand is used to pull some item/tool out of the construction
if(!holdingnull)
if(!holding)
. = 0
break
if(user.get_active_hand() != holding)
. = 0
break
if (progress)
qdel(progbar)
+1 -1
View File
@@ -357,7 +357,7 @@ proc/checkhtml(var/t)
if(!lentext(string))
return "\[...\]"
else
return string
return html_encode(string) //NO DECODED HTML YOU CHUCKLEFUCKS
else
return "[copytext_preserve_html(string, 1, 37)]..."
-89
View File
@@ -601,95 +601,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
else return get_step(ref, base_dir)
/proc/do_mob(var/mob/user , var/mob/target, var/time = 30, numticks = 5, var/uninterruptible = 0) //This is quite an ugly solution but i refuse to use the old request system.
if(!user || !target)
return 0
if(numticks == 0)
return 0
var/user_loc = user.loc
var/target_loc = target.loc
var/holding = user.get_active_hand()
var/timefraction = round(time/numticks)
var/image/progbar
for(var/i = 1 to numticks)
if(user.client)
progbar = make_progress_bar(i, numticks, target)
user.client.images |= progbar
sleep(timefraction)
if(!user || !target)
if(user && user.client)
user.client.images -= progbar
return 0
if (!uninterruptible && (user.loc != user_loc || target.loc != target_loc || user.get_active_hand() != holding || user.stat || user.stunned || user.weakened || user.paralysis || user.lying))
if(user && user.client)
user.client.images -= progbar
return 0
if(user && user.client)
user.client.images -= progbar
if(user && user.client)
user.client.images -= progbar
return 1
/proc/make_progress_bar(var/current_number, var/goal_number, var/atom/target)
if(current_number && goal_number && target)
var/image/progbar
progbar = image("icon" = 'icons/effects/doafter_icon.dmi', "loc" = target, "icon_state" = "prog_bar_0")
progbar.icon_state = "prog_bar_[round(((current_number / goal_number) * 100), 10)]"
progbar.pixel_y = 32
return progbar
/proc/do_after(mob/user, delay, numticks = 5, needhand = 1, atom/target = null)
if(!user)
return 0
if(numticks == 0)
return 0
var/atom/Tloc = null
if(target)
Tloc = target.loc
var/delayfraction = round(delay/numticks)
var/atom/Uloc = user.loc
var/holding = user.get_active_hand()
var/holdingnull = 1 //User is not holding anything
if(holding)
holdingnull = 0 //User is holding a tool of some kind
var/image/progbar
for (var/i = 1 to numticks)
if(user.client)
progbar = make_progress_bar(i, numticks, target)
user.client.images |= progbar
sleep(delayfraction)
if(!user || user.stat || user.weakened || user.stunned || !(user.loc == Uloc))
if(user && user.client)
user.client.images -= progbar
return 0
if(Tloc && (!target || Tloc != target.loc)) //Tloc not set when we don't want to track target
if(user && user.client)
user.client.images -= progbar
return 0 // Target no longer exists or has moved
if(needhand)
//This might seem like an odd check, but you can still need a hand even when it's empty
//i.e the hand is used to insert some item/tool into the construction
if(!holdingnull)
if(!holding)
if(user && user.client)
user.client.images -= progbar
return 0
if(user.get_active_hand() != holding)
if(user && user.client)
user.client.images -= progbar
return 0
if(user && user.client)
user.client.images -= progbar
if(user && user.client)
user.client.images -= progbar
if(user && user.client)
user.client.images -= progbar
return 1
//Takes: Anything that could possibly have variables and a varname to check.
//Returns: 1 if found, 0 if not.
/proc/hasvar(var/datum/A, var/varname)
+1
View File
@@ -8,6 +8,7 @@
//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_PAPER_MESSAGE_LEN 3072
#define MAX_PAPER_FIELDS 50
#define MAX_BOOK_MESSAGE_LEN 9216
#define MAX_NAME_LEN 26
+1 -1
View File
@@ -2,7 +2,7 @@
//Head accessory styles
var/global/list/head_accessory_styles_list = list() //stores /datum/sprite_accessory/head_accessory indexed by name
//Marking styles
var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/horns indexed by name
var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/body_markings indexed by name
//Hairstyles
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
var/global/list/hair_styles_male_list = list()
+3 -1
View File
@@ -22,6 +22,7 @@ var/global/list/spirits = list() //List of all the spirits, including Masks
var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player
var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player
var/global/list/respawnable_list = list() //List of all mobs, dead or in mindless creatures that still be respawned.
var/global/list/simple_animal_list = list() //List of all simple animals, including clientless
//global var of unsafe-to-spawn-on-reaction mobs
var/global/list/blocked_mobs = list(/mob/living/simple_animal,
@@ -66,7 +67,8 @@ var/global/list/blocked_mobs = list(/mob/living/simple_animal,
/mob/living/simple_animal/hostile/winter/santa/stage_1,
/mob/living/simple_animal/hostile/winter/santa/stage_2,
/mob/living/simple_animal/hostile/winter/santa/stage_3,
/mob/living/simple_animal/hostile/winter/santa/stage_4
/mob/living/simple_animal/hostile/winter/santa/stage_4,
/mob/living/simple_animal/hostile/alien/maid
)
var/global/list/med_hud_users = list()
+4 -2
View File
@@ -11,8 +11,6 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
var/global/list/airlocks = list() //list of all airlocks
var/global/list/singularities = list() //list of all singularities
var/global/list/janitorial_equipment = list() //list of janitorial equipment
var/global/list/aibots = list() // AI controlled bots
var/global/list/table_recipes = list() //list of all table craft recipes
var/global/list/all_areas = list()
@@ -24,6 +22,10 @@ var/global/list/apcs = list()
var/global/list/air_alarms = list()
var/global/list/power_monitors = list()
var/global/list/navbeacons = list() //list of all bot nagivation beacons, used for patrolling.
var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons.
var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons.
var/global/list/beacons = list()
var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none.
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
+5 -1
View File
@@ -130,4 +130,8 @@
#define ui_ai_pda_log "SOUTH:6,WEST+11"
#define ui_ai_take_picture "SOUTH:6,WEST+12"
#define ui_ai_view_images "SOUTH:6,WEST+13"
#define ui_ai_sensor "SOUTH:6,WEST+14"
#define ui_ai_sensor "SOUTH:6,WEST+14"
// Bots
#define ui_bot_radio "EAST-1:28,SOUTH:7"
#define ui_bot_pull "EAST-2:26,SOUTH:7"
+70
View File
@@ -0,0 +1,70 @@
/obj/screen/bot
icon = 'icons/mob/screen1_bot.dmi'
/obj/screen/bot/radio
name = "radio"
icon_state = "radio"
/obj/screen/bot/radio/Click()
if(isbot(usr))
var/mob/living/simple_animal/bot/B = usr
B.Radio.interact(usr)
/datum/hud/proc/bot_hud()
src.adding = list()
src.other = list()
var/obj/screen/using
using = new /obj/screen/bot/radio()
using.name = "radio"
using.dir = SOUTHWEST
using.icon_state = "radio"
using.screen_loc = ui_bot_radio
using.layer = 20
src.adding += using
mymob.healths = new /obj/screen()
mymob.healths.icon = 'icons/mob/screen1_bot.dmi'
mymob.healths.icon_state = "health0"
mymob.healths.name = "health"
mymob.healths.screen_loc = ui_borg_health
mymob.oxygen = new /obj/screen()
mymob.oxygen.icon = 'icons/mob/screen1_bot.dmi'
mymob.oxygen.icon_state = "oxy0"
mymob.oxygen.name = "oxygen"
mymob.oxygen.screen_loc = ui_oxygen
mymob.fire = new /obj/screen()
mymob.fire.icon = 'icons/mob/screen1_bot.dmi'
mymob.fire.icon_state = "fire0"
mymob.fire.name = "fire"
mymob.fire.screen_loc = ui_fire
mymob.pullin = new /obj/screen/pull()
mymob.pullin.icon = 'icons/mob/screen1_bot.dmi'
mymob.pullin.update_icon(mymob)
mymob.pullin.screen_loc = ui_bot_pull
mymob.blind = new /obj/screen()
mymob.blind.icon = 'icons/mob/screen1_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.layer = 0
mymob.blind.mouse_opacity = 0
mymob.flash = new /obj/screen()
mymob.flash.icon = 'icons/mob/screen1_bot.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
mymob.flash.layer = 17
mymob.client.screen = list()
mymob.client.screen += list(mymob.oxygen, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash)
mymob.client.screen += adding + other
mymob.client.screen += mymob.client.void
return
+8 -2
View File
@@ -96,6 +96,8 @@ var/datum/global_hud/global_hud = new()
var/obj/screen/lingchemdisplay
var/obj/screen/lingstingdisplay
var/obj/screen/guardianhealthdisplay
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/vampire_blood_display
@@ -192,8 +194,8 @@ datum/hud/New(mob/owner)
ai_hud()
else if(isrobot(mymob))
robot_hud()
else if(iscorgi(mymob))
corgi_hud()
else if(isbot(mymob))
bot_hud()
else if(isobserver(mymob))
ghost_hud()
else if(isovermind(mymob))
@@ -204,6 +206,10 @@ datum/hud/New(mob/owner)
swarmer_hud()
else if(isguardian(mymob))
guardian_hud()
else if(ispet(mymob))
corgi_hud()
else
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12(var/full = 0 as null)
+9 -2
View File
@@ -6,6 +6,7 @@
// No comment
/atom/proc/attackby(obj/item/W, mob/living/user, params)
return
/atom/movable/attackby(obj/item/W, mob/living/user, params)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
@@ -14,8 +15,14 @@
/mob/living/attackby(obj/item/I, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
if(istype(I) && ismob(user))
I.attack(src, user)
if(stat == DEAD && !isnull(butcher_results)) //can we butcher it?
if(istype(I, /obj/item/weapon/kitchen/knife))
user << "<span class='notice'>You begin to butcher [src]...</span>"
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80))
harvest(user)
return
I.attack(src, user)
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
+37
View File
@@ -0,0 +1,37 @@
var/global/datum/controller/process/animal/animal_master
/datum/controller/process/animal
var/current_cycle
/datum/controller/process/animal/setup()
name = "animal"
schedule_interval = 20 // every 2 seconds
start_delay = 16
log_startup_progress("Simple animal ticker starting up.")
if(animal_master)
qdel(animal_master) //only one mob master
animal_master = src
/datum/controller/process/animal/started()
..()
if(!simple_animal_list)
simple_animal_list = list()
/datum/controller/process/animal/statProcess()
..()
stat(null, "[simple_animal_list.len] simple animals")
/datum/controller/process/animal/doWork()
for(last_object in simple_animal_list)
var/mob/living/simple_animal/M = last_object
if(istype(M) && isnull(M.gcDestroyed))
if(!M.client && M.stat == CONSCIOUS)
try
M.process_ai()
catch(var/exception/e)
catchException(e, M)
SCHECK
else
catchBadType(M)
simple_animal_list -= M
current_cycle++
+44
View File
@@ -0,0 +1,44 @@
var/datum/controller/process/diseases/disease_master
/datum/controller/process/diseases
var/list/currentrun = list()
var/list/processing_diseases = list()
/datum/controller/process/diseases/setup()
name = "disease"
schedule_interval = 20 // every 2 seconds
start_delay = 7
log_startup_progress("Disease controller starting.")
if(disease_master)
qdel(disease_master) //only one mob master
disease_master = src
register_diseases() //register all pre-round diseases created
/datum/controller/process/diseases/statProcess()
..()
stat(null, "[processing_diseases.len] diseases")
/datum/controller/process/diseases/doWork()
src.currentrun = processing_diseases.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/datum/disease/thing = currentrun[1]
currentrun.Cut(1, 2)
if(thing)
try
thing.process()
catch(var/exception/e)
catchException(e, thing)
SCHECK
else
catchBadType(thing)
processing_diseases.Remove(thing)
/datum/controller/process/diseases/proc/register_diseases()
for(var/datum/disease/D in world)
if(!processing_diseases.Find(D))
D.register()
+1 -1
View File
@@ -277,7 +277,7 @@
name = "Completed Robots"
id = "finished"
blacklist = null
whitelist = list(/obj/mecha,/obj/machinery/bot,/mob/living/silicon/robot)
whitelist = list(/obj/mecha,/mob/living/simple_animal/bot,/mob/living/silicon/robot)
mobcheck = 1
//todo: detect and allow finished cyborg endoskeletons with no brain
contains(var/atom/A)
+4 -4
View File
@@ -241,7 +241,7 @@
if(ismob(D))
body += "<option value='?_src_=vars;give_spell=\ref[D]'>Give Spell</option>"
body += "<option value='?_src_=vars;give_disease2=\ref[D]'>Give Disease</option>"
body += "<option value='?_src_=vars;give_disease=\ref[D]'>Give Disease</option>"
body += "<option value='?_src_=vars;godmode=\ref[D]'>Toggle Godmode</option>"
body += "<option value='?_src_=vars;build_mode=\ref[D]'>Toggle Build Mode</option>"
@@ -515,15 +515,15 @@ body
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease2"])
else if(href_list["give_disease"])
if(!check_rights(R_SERVER|R_EVENT)) return
var/mob/M = locate(href_list["give_disease2"])
var/mob/M = locate(href_list["give_disease"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_disease2(M)
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["godmode"])
+144
View File
@@ -0,0 +1,144 @@
/mob/proc/HasDisease(datum/disease/D)
for(var/datum/disease/DD in viruses)
if(D.IsSame(DD))
return 1
return 0
/mob/proc/CanContractDisease(datum/disease/D)
if(stat == DEAD)
return 0
if(D.GetDiseaseID() in resistances)
return 0
if(HasDisease(D))
return 0
if(count_by_type(viruses, /datum/disease/advance) >= 3)
return 0
if(!(type in D.viable_mobtypes))
return -1 //for stupid fucking monkies
return 1
/mob/proc/ContractDisease(datum/disease/D)
if(!CanContractDisease(D))
return 0
AddDisease(D)
/mob/proc/AddDisease(datum/disease/D)
var/datum/disease/DD = new D.type(1, D, 0)
viruses += DD
DD.affected_mob = src
DD.holder = src
//Copy properties over. This is so edited diseases persist.
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
for(var/V in DD.vars)
if(V in skipped)
continue
if(istype(DD.vars[V],/list))
var/list/L = D.vars[V]
DD.vars[V] = L.Copy()
else
DD.vars[V] = D.vars[V]
DD.affected_mob.med_hud_set_status()
/mob/living/carbon/ContractDisease(datum/disease/D)
if(!CanContractDisease(D))
return 0
var/obj/item/clothing/Cl = null
var/passed = 1
var/head_ch = 100
var/body_ch = 100
var/hands_ch = 25
var/feet_ch = 25
if(D.spread_flags & CONTACT_HANDS)
head_ch = 0
body_ch = 0
hands_ch = 100
feet_ch = 0
if(D.spread_flags & CONTACT_FEET)
head_ch = 0
body_ch = 0
hands_ch = 0
feet_ch = 100
if(prob(15/D.permeability_mod))
return
/* if(satiety>0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease.
return*/
var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
switch(target_zone)
if(1)
if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper))
Cl = H.head
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.wear_mask))
Cl = H.wear_mask
passed = prob((Cl.permeability_coefficient*100) - 1)
if(2)
if(isobj(H.wear_suit))
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(slot_w_uniform))
Cl = slot_w_uniform
passed = prob((Cl.permeability_coefficient*100) - 1)
if(3)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.gloves))
Cl = H.gloves
passed = prob((Cl.permeability_coefficient*100) - 1)
if(4)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET)
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.shoes))
Cl = H.shoes
passed = prob((Cl.permeability_coefficient*100) - 1)
if(!passed && (D.spread_flags & AIRBORNE) && !internal)
passed = (prob((50*D.permeability_mod) - 1))
if(passed)
AddDisease(D)
//Same as ContractDisease, except never overidden clothes checks
/mob/proc/ForceContractDisease(datum/disease/D)
if(!CanContractDisease(D))
return 0
AddDisease(D)
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
if(species.virus_immune)
return 0
return ..()
/mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D)
. = ..()
if(. == -1)
if(D.viable_mobtypes.Find(/mob/living/carbon/human))
return 1 //this is stupid as fuck but because monkeys are only half the time actually subtypes of humans they need this
+209
View File
@@ -0,0 +1,209 @@
//Visibility Flags
#define HIDDEN_SCANNER 1
#define HIDDEN_PANDEMIC 2
//Disease Flags
#define CURABLE 1
#define CAN_CARRY 2
#define CAN_RESIST 4
//Spread Flags
#define SPECIAL 1
#define NON_CONTAGIOUS 2
#define BLOOD 4
#define CONTACT_FEET 8
#define CONTACT_HANDS 16
#define CONTACT_GENERAL 32
#define AIRBORNE 64
//Severity Defines
#define NONTHREAT "No threat"
#define MINOR "Minor"
#define MEDIUM "Medium"
#define HARMFUL "Harmful"
#define DANGEROUS "Dangerous!"
#define BIOHAZARD "BIOHAZARD THREAT!"
var/list/diseases = subtypesof(/datum/disease)
/datum/disease
//Flags
var/visibility_flags = 0
var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST
var/spread_flags = AIRBORNE
//Fluff
var/form = "Virus"
var/name = "No disease"
var/desc = ""
var/agent = "some microbes"
var/spread_text = ""
var/cure_text = ""
//Stages
var/stage = 1
var/max_stages = 0
var/stage_prob = 4
//Other
var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite.
var/list/viable_mobtypes = list() //typepaths of viable mobs
var/mob/living/carbon/affected_mob = null
var/atom/movable/holder = null
var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
var/infectivity = 65
var/cure_chance = 8
var/carrier = 0 //If our host is only a carrier
var/permeability_mod = 1
var/severity = NONTHREAT
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list() //dna_spread special bullshit
/datum/disease/proc/stage_act()
var/cure = has_cure()
if(carrier && !cure)
return
stage = min(stage, max_stages)
if(!cure)
if(prob(stage_prob))
stage = min(stage + 1,max_stages)
else
if(prob(cure_chance))
stage = max(stage - 1, 1)
if(disease_flags & CURABLE)
if(cure && prob(cure_chance))
cure()
/datum/disease/proc/has_cure()
if(!(disease_flags & CURABLE))
return 0
. = cures.len
for(var/C_id in cures)
if(!affected_mob.reagents.has_reagent(C_id))
.--
if(!. || (needs_all_cures && . < cures.len))
return 0
/datum/disease/proc/spread(atom/source, force_spread = 0)
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
return
if(affected_mob)
if(affected_mob.reagents.has_reagent("spaceacillin"))
return
var/spread_range = 1
if(force_spread)
spread_range = force_spread
if(spread_flags & AIRBORNE)
spread_range++
if(!source)
if(affected_mob)
source = affected_mob
else
return
if(isturf(source.loc))
for(var/mob/living/carbon/C in oview(spread_range, source))
if(isturf(C.loc))
if(AStar(source, C.loc, /turf/proc/Distance, spread_range, adjacent = (spread_flags & AIRBORNE) ? /turf/proc/reachableAdjacentAtmosTurfs : /turf/proc/reachableAdjacentTurfs))
C.ContractDisease(src)
/datum/disease/proc/process()
if(!holder)
disease_master.processing_diseases -= src
return
if(prob(infectivity))
spread(holder)
if(affected_mob)
for(var/datum/disease/D in affected_mob.viruses)
if(D != src)
if(IsSame(D))
qdel(D)
if(holder == affected_mob)
if(affected_mob.stat != DEAD)
stage_act()
if(!affected_mob)
if(prob(70))
if(--longevity<=0)
cure()
/datum/disease/proc/cure()
if(affected_mob)
if(disease_flags & CAN_RESIST)
if(!(type in affected_mob.resistances))
affected_mob.resistances += type
remove_virus()
qdel(src)
/datum/disease/New()
if(required_organs && required_organs.len)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
for(var/obj/item/organ/O in required_organs)
if(!locate(O) in H.organs)
if(!locate(O) in H.internal_organs)
cure()
return
if(disease_master)
register()
/datum/disease/proc/register()
disease_master.processing_diseases += src
/datum/disease/proc/IsSame(datum/disease/D)
if(istype(src, D.type))
return 1
return 0
/datum/disease/proc/Copy()
var/datum/disease/D = new type()
D.strain_data = strain_data.Copy()
return D
/datum/disease/proc/GetDiseaseID()
return type
/datum/disease/Destroy()
if(disease_master && disease_master.processing_diseases.Find(src))
disease_master.processing_diseases.Remove(src)
return ..()
/datum/disease/proc/IsSpreadByTouch()
if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL)
return 1
return 0
//don't use this proc directly. this should only ever be called by cure()
/datum/disease/proc/remove_virus()
affected_mob.viruses -= src //remove the datum from the list
affected_mob.med_hud_set_status()
+456
View File
@@ -0,0 +1,456 @@
/*
Advance Disease is a system for Virologist to Engineer their own disease with symptoms that have effects and properties
which add onto the overall disease.
If you need help with creating new symptoms or expanding the advance disease, ask for Giacom on #coderbus.
*/
var/list/archive_diseases = list()
// The order goes from easy to cure to hard to cure.
var/list/advance_cures = list(
"sodiumchloride", "sugar", "orangejuice",
"spaceacillin", "salglu_solution", "ethanol",
"teporone", "diphenhydramine", "lipolicide",
"silver", "gold"
)
/*
PROPERTIES
*/
/datum/disease/advance
name = "Unknown" // We will always let our Virologist name our disease.
desc = "An engineered disease which can contain a multitude of symptoms."
form = "Advance Disease" // Will let med-scanners know that this disease was engineered.
agent = "advance microbes"
max_stages = 5
spread_text = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
// NEW VARS
var/list/symptoms = list() // The symptoms of the disease.
var/id = ""
var/processing = 0
/*
OLD PROCS
*/
/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D)
// Setup our dictionary if it hasn't already.
if(!dictionary_symptoms.len)
for(var/symp in list_symptoms)
var/datum/symptom/S = new symp
dictionary_symptoms[S.id] = symp
if(!istype(D))
D = null
// Generate symptoms if we weren't given any.
if(!symptoms || !symptoms.len)
if(!D || !D.symptoms || !D.symptoms.len)
symptoms = GenerateSymptoms(0, 2)
else
for(var/datum/symptom/S in D.symptoms)
symptoms += new S.type
Refresh()
..(process, D)
return
/datum/disease/advance/Destroy()
if(processing)
for(var/datum/symptom/S in symptoms)
S.End(src)
return ..()
// Randomly pick a symptom to activate.
/datum/disease/advance/stage_act()
..()
if(symptoms && symptoms.len)
if(!processing)
processing = 1
for(var/datum/symptom/S in symptoms)
S.Start(src)
for(var/datum/symptom/S in symptoms)
S.Activate(src)
else
CRASH("We do not have any symptoms during stage_act()!")
// Compares type then ID.
/datum/disease/advance/IsSame(datum/disease/advance/D)
if(!(istype(D, /datum/disease/advance)))
return 0
if(src.GetDiseaseID() != D.GetDiseaseID())
return 0
return 1
// To add special resistances.
/datum/disease/advance/cure(resistance=1)
if(affected_mob)
var/id = "[GetDiseaseID()]"
if(resistance && !(id in affected_mob.resistances))
affected_mob.resistances[id] = id
remove_virus()
qdel(src) //delete the datum to stop it processing
// Returns the advance disease with a different reference memory.
/datum/disease/advance/Copy(process = 0)
return new /datum/disease/advance(process, src, 1)
/*
NEW PROCS
*/
// Mix the symptoms of two diseases (the src and the argument)
/datum/disease/advance/proc/Mix(datum/disease/advance/D)
if(!(src.IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(new S.type)
/datum/disease/advance/proc/HasSymptom(datum/symptom/S)
for(var/datum/symptom/symp in symptoms)
if(symp.id == S.id)
return 1
return 0
// Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated.
/datum/disease/advance/proc/GenerateSymptoms(level_min, level_max, amount_get = 0)
var/list/generated = list() // Symptoms we generated.
// Generate symptoms. By default, we only choose non-deadly symptoms.
var/list/possible_symptoms = list()
for(var/symp in list_symptoms)
var/datum/symptom/S = new symp
if(S.level >= level_min && S.level <= level_max)
if(!HasSymptom(S))
possible_symptoms += S
if(!possible_symptoms.len)
return generated
// Random chance to get more than one symptom
var/number_of = amount_get
if(!amount_get)
number_of = 1
while(prob(20))
number_of += 1
for(var/i = 1; number_of >= i && possible_symptoms.len; i++)
generated += pick_n_take(possible_symptoms)
return generated
/datum/disease/advance/proc/Refresh(new_name = 0)
//world << "[src.name] \ref[src] - REFRESH!"
var/list/properties = GenerateProperties()
AssignProperties(properties)
id = null
if(!archive_diseases[GetDiseaseID()])
if(new_name)
AssignName()
archive_diseases[GetDiseaseID()] = src // So we don't infinite loop
archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1)
var/datum/disease/advance/A = archive_diseases[GetDiseaseID()]
AssignName(A.name)
//Generate disease properties based on the effects. Returns an associated list.
/datum/disease/advance/proc/GenerateProperties()
if(!symptoms || !symptoms.len)
CRASH("We did not have any symptoms before generating properties.")
return
var/list/properties = list("resistance" = 1, "stealth" = 1, "stage_rate" = 1, "transmittable" = 1, "severity" = 0)
for(var/datum/symptom/S in symptoms)
properties["resistance"] += S.resistance
properties["stealth"] += S.stealth
properties["stage_rate"] += S.stage_speed
properties["transmittable"] += S.transmittable
properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity symptom
return properties
// Assign the properties that are in the list.
/datum/disease/advance/proc/AssignProperties(list/properties = list())
if(properties && properties.len)
switch(properties["stealth"])
if(2 to 3)
visibility_flags = HIDDEN_SCANNER
if(3 to INFINITY)
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
// The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
SetSpread(Clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE))
permeability_mod = max(Ceiling(0.4 * properties["transmittable"]), 1)
cure_chance = 15 - Clamp(properties["resistance"], -5, 5) // can be between 10 and 20
stage_prob = max(properties["stage_rate"], 2)
SetSeverity(properties["severity"])
GenerateCure(properties)
else
CRASH("Our properties were empty or null!")
// Assign the spread type and give it the correct description.
/datum/disease/advance/proc/SetSpread(spread_id)
switch(spread_id)
if(NON_CONTAGIOUS)
spread_text = "None"
if(SPECIAL)
spread_text = "None"
if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET)
spread_text = "On contact"
if(AIRBORNE)
spread_text = "Airborne"
if(BLOOD)
spread_text = "Blood"
spread_flags = spread_id
/datum/disease/advance/proc/SetSeverity(level_sev)
switch(level_sev)
if(-INFINITY to 0)
severity = NONTHREAT
if(1)
severity = MINOR
if(2)
severity = MEDIUM
if(3)
severity = HARMFUL
if(4)
severity = DANGEROUS
if(5 to INFINITY)
severity = BIOHAZARD
else
severity = "Unknown"
// Will generate a random cure, the less resistance the symptoms have, the harder the cure.
/datum/disease/advance/proc/GenerateCure(list/properties = list())
if(properties && properties.len)
var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len)
//world << "Res = [res]"
cures = list(advance_cures[res])
// Get the cure name from the cure_id
var/datum/reagent/D = chemical_reagents_list[cures[1]]
cure_text = D.name
return
// Randomly generate a symptom, has a chance to lose or gain a symptom.
/datum/disease/advance/proc/Evolve(min_level, max_level)
var/s = safepick(GenerateSymptoms(min_level, max_level, 1))
if(s)
AddSymptom(s)
Refresh(1)
return
// Randomly remove a symptom.
/datum/disease/advance/proc/Devolve()
if(symptoms.len > 1)
var/s = safepick(symptoms)
if(s)
RemoveSymptom(s)
Refresh(1)
return
// Name the disease.
/datum/disease/advance/proc/AssignName(name = "Unknown")
src.name = name
return
// Return a unique ID of the disease.
/datum/disease/advance/GetDiseaseID()
if(!id)
var/list/L = list()
for(var/datum/symptom/S in symptoms)
L += S.id
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
var/result = list2text(L, ":")
id = result
return id
// Add a symptom, if it is over the limit (with a small chance to be able to go over)
// we take a random symptom away and add the new one.
/datum/disease/advance/proc/AddSymptom(datum/symptom/S)
if(HasSymptom(S))
return
if(symptoms.len < 5 + rand(-1, 1))
symptoms += S
else
RemoveSymptom(pick(symptoms))
symptoms += S
return
// Simply removes the symptom.
/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
symptoms -= S
return
/*
Static Procs
*/
// Mix a list of advance diseases and return the mixed result.
/proc/Advance_Mix(var/list/D_list)
//world << "Mixing!!!!"
var/list/diseases = list()
for(var/datum/disease/advance/A in D_list)
diseases += A.Copy()
if(!diseases.len)
return null
if(diseases.len <= 1)
return pick(diseases) // Just return the only entry.
var/i = 0
// Mix our diseases until we are left with only one result.
while(i < 20 && diseases.len > 1)
i++
var/datum/disease/advance/D1 = pick(diseases)
diseases -= D1
var/datum/disease/advance/D2 = pick(diseases)
D2.Mix(D1)
// Should be only 1 entry left, but if not let's only return a single entry
//world << "END MIXING!!!!!"
var/datum/disease/advance/to_return = pick(diseases)
to_return.Refresh(1)
return to_return
/proc/SetViruses(datum/reagent/R, list/data)
if(data)
var/list/preserve = list()
if(istype(data) && data["viruses"])
for(var/datum/disease/A in data["viruses"])
preserve += A.Copy()
R.data = data.Copy()
if(preserve.len)
R.data["viruses"] = preserve
/proc/AdminCreateVirus(client/user)
if(!user)
return
var/i = 5
var/datum/disease/advance/D = new(0, null)
D.symptoms = list()
var/list/symptoms = list()
symptoms += "Done"
symptoms += list_symptoms.Copy()
do
if(user)
var/symptom = input(user, "Choose a symptom to add ([i] remaining)", "Choose a Symptom") in symptoms
if(isnull(symptom))
return
else if(istext(symptom))
i = 0
else if(ispath(symptom))
var/datum/symptom/S = new symptom
if(!D.HasSymptom(S))
D.symptoms += S
i -= 1
while(i > 0)
if(D.symptoms.len > 0)
var/new_name = stripped_input(user, "Name your new disease.", "New Name")
if(!new_name)
return
D.AssignName(new_name)
D.Refresh()
for(var/datum/disease/advance/AD in disease_master.processing)
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
if(H.z != 1)
continue
if(!H.HasDisease(D))
H.ForceContractDisease(D)
break
var/list/name_symptoms = list()
for(var/datum/symptom/S in D.symptoms)
name_symptoms += S.name
message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
/*
/mob/verb/test()
for(var/datum/disease/D in disease_master.processing)
src << "<a href='?_src_=vars;Vars=\ref[D]'>[D.name] - [D.holder]</a>"
*/
/datum/disease/advance/proc/totalStageSpeed()
var/total_stage_speed = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_stage_speed += S.stage_speed
return total_stage_speed
/datum/disease/advance/proc/totalStealth()
var/total_stealth = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_stealth += S.stealth
return total_stealth
/datum/disease/advance/proc/totalResistance()
var/total_resistance = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_resistance += S.resistance
return total_resistance
/datum/disease/advance/proc/totalTransmittable()
var/total_transmittable = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_transmittable += S.transmittable
return total_transmittable
#undef RANDOM_STARTING_LEVEL
+59
View File
@@ -0,0 +1,59 @@
// Cold
/datum/disease/advance/cold/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Cold"
symptoms = list(new/datum/symptom/sneeze)
..(process, D, copy)
// Flu
/datum/disease/advance/flu/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Flu"
symptoms = list(new/datum/symptom/cough)
..(process, D, copy)
// Voice Changing
/datum/disease/advance/voice_change/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Epiglottis Mutation"
symptoms = list(new/datum/symptom/voice_change)
..(process, D, copy)
// Toxin Filter
/datum/disease/advance/heal/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Liver Enhancer"
symptoms = list(new/datum/symptom/heal)
..(process, D, copy)
// Hullucigen
/datum/disease/advance/hullucigen/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Reality Impairment"
symptoms = list(new/datum/symptom/hallucigen)
..(process, D, copy)
// Sensory Restoration
/datum/disease/advance/sensory_restoration/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Reality Enhancer"
symptoms = list(new/datum/symptom/sensory_restoration)
..(process, D, copy)
// Sensory Destruction
/datum/disease/advance/sensory_destruction/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Reality Destruction"
symptoms = list(new/datum/symptom/sensory_destruction)
..(process, D, copy)
@@ -0,0 +1,49 @@
/*
//////////////////////////////////////
Facial Hypertrichosis
Very very Noticable.
Decreases resistance slightly.
Decreases stage speed.
Reduced transmittability
Intense Level.
BONUS
Makes the mob grow a massive beard, regardless of gender.
//////////////////////////////////////
*/
/datum/symptom/beard
name = "Facial Hypertrichosis"
stealth = -3
resistance = -1
stage_speed = -3
transmittable = -1
level = 4
severity = 1
/datum/symptom/beard/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
switch(A.stage)
if(1, 2)
H << "<span class='warning'>Your chin itches.</span>"
if(H.f_style == "Shaved")
H.f_style = "Jensen Beard"
H.update_hair()
if(3, 4)
H << "<span class='warning'>You feel tough.</span>"
if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard") && !(H.f_style == "Full Beard"))
H.f_style = "Full Beard"
H.update_hair()
else
H << "<span class='warning'>You feel manly!</span>"
if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard"))
H.f_style = pick("Dwarf Beard", "Very Long Beard")
H.update_hair()
return
@@ -0,0 +1,53 @@
/*
//////////////////////////////////////
Choking
Very very noticable.
Lowers resistance.
Decreases stage speed.
Decreases transmittablity tremendously.
Moderate Level.
Bonus
Inflicts spikes of oxyloss
//////////////////////////////////////
*/
/datum/symptom/choking
name = "Choking"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -4
level = 3
severity = 3
/datum/symptom/choking/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
M << "<span class='warning'>[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]</span>"
if(3, 4)
M << "<span class='warning'><b>[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]</span>"
Choke_stage_3_4(M, A)
M.emote("gasp")
else
M << "<span class='userdanger'>[pick("You're choking!", "You can't breathe!")]</span>"
Choke(M, A)
M.emote("gasp")
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1)
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5))
M.adjustOxyLoss(get_damage)
return 1
@@ -0,0 +1,40 @@
/*
//////////////////////////////////////
Confusion
Little bit hidden.
Lowers resistance.
Decreases stage speed.
Not very transmittable.
Intense Level.
Bonus
Makes the affected mob be confused for short periods of time.
//////////////////////////////////////
*/
/datum/symptom/confusion
name = "Confusion"
stealth = 1
resistance = -1
stage_speed = -3
transmittable = 0
level = 4
severity = 2
/datum/symptom/confusion/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='warning'>[pick("Your head hurts.", "Your mind blanks for a moment.")]</span>"
else
M << "<span class='userdanger'>You can't think straight!</span>"
M.confused = min(100, M.confused + 8)
return
@@ -0,0 +1,40 @@
/*
//////////////////////////////////////
Coughing
Noticable.
Little Resistance.
Doesn't increase stage speed much.
Transmittable.
Low Level.
BONUS
Will force the affected mob to drop small items!
//////////////////////////////////////
*/
/datum/symptom/cough
name = "Cough"
stealth = -1
resistance = 3
stage_speed = 1
transmittable = 2
level = 1
severity = 1
/datum/symptom/cough/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
M << "<span notice='warning'>[pick("You swallow excess mucus.", "You lightly cough.")]</span>"
else
M.emote("cough")
var/obj/item/I = M.get_active_hand()
if(I && I.w_class == 1)
M.drop_item()
return
@@ -0,0 +1,63 @@
/*
//////////////////////////////////////
Damage Converter
Little bit hidden.
Lowers resistance tremendously.
Decreases stage speed tremendously.
Reduced transmittablity
Intense Level.
Bonus
Slowly converts brute/fire damage to toxin.
//////////////////////////////////////
*/
/datum/symptom/damage_converter
name = "Toxic Compensation"
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -2
level = 4
/datum/symptom/damage_converter/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Convert(M)
return
/datum/symptom/damage_converter/proc/Convert(mob/living/M)
var/get_damage = rand(1, 2)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/list/parts = H.get_damaged_organs(1,1) //1,1 because it needs inputs.
if(!parts.len)
return
M.heal_overall_damage(get_damage, get_damage)
M.adjustToxLoss(get_damage*parts.len)
else
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
M.adjustFireLoss(-get_damage)
M.adjustBruteLoss(-get_damage)
M.adjustToxLoss(get_damage)
else
return
return 1
@@ -0,0 +1,43 @@
/*
//////////////////////////////////////
Deafness
Slightly noticable.
Lowers resistance.
Decreases stage speed slightly.
Decreases transmittablity.
Intense Level.
Bonus
Causes intermittent loss of hearing.
//////////////////////////////////////
*/
/datum/symptom/deafness
name = "Deafness"
stealth = -1
resistance = -2
stage_speed = -1
transmittable = -3
level = 4
severity = 3
/datum/symptom/deafness/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3, 4)
M << "<span class='warning'>[pick("You hear a ringing in your ear.", "Your ears pop.")]</span>"
if(5)
if(!(M.ear_deaf))
M << "<span class='userdanger'>Your ears pop and begin ringing loudly!</span>"
M.setEarDamage(-1,INFINITY) //Shall be enough
spawn(200)
if(M)
M << "<span class='warning'>The ringing in your ears fades...</span>"
M.setEarDamage(-1,0)
return
@@ -0,0 +1,38 @@
/*
//////////////////////////////////////
Dizziness
Hidden.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittability
Intense Level.
Bonus
Shakes the affected mob's screen for short periods.
//////////////////////////////////////
*/
/datum/symptom/dizzy // Not the egg
name = "Dizziness"
stealth = 2
resistance = -2
stage_speed = -3
transmittable = -1
level = 4
severity = 2
/datum/symptom/dizzy/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='warning'>[pick("You feel dizzy.", "Your head spins.")]</span>"
else
M << "<span class='userdanger'>A wave of dizziness washes over you!</span>"
M.Dizzy(5)
return
@@ -0,0 +1,41 @@
/*
//////////////////////////////////////
Fever
No change to hidden.
Increases resistance.
Increases stage speed.
Little transmittable.
Low level.
Bonus
Heats up your body.
//////////////////////////////////////
*/
/datum/symptom/fever
name = "Fever"
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 2
level = 2
severity = 2
/datum/symptom/fever/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
M << "<span class='warning'>[pick("You feel hot.", "You feel like you're burning.")]</span>"
if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT)
Heat(M, A)
return
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return 1
@@ -0,0 +1,57 @@
/*
//////////////////////////////////////
Spontaneous Combustion
Slightly hidden.
Lowers resistance tremendously.
Decreases stage tremendously.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
Ignites infected mob.
//////////////////////////////////////
*/
/datum/symptom/fire
name = "Spontaneous Combustion"
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
level = 6
severity = 5
/datum/symptom/fire/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3)
M << "<span class='warning'>[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]</span>"
if(4)
Firestacks_stage_4(M, A)
M.IgniteMob()
M << "<span class='userdanger'>Your skin bursts into flames!</span>"
M.emote("scream")
if(5)
Firestacks_stage_5(M, A)
M.IgniteMob()
M << "<span class='userdanger'>Your skin erupts into an inferno!</span>"
M.emote("scream")
return
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = (sqrt(20+A.totalStageSpeed()*2))-(sqrt(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks/2)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
var/get_stacks = (sqrt(20+A.totalStageSpeed()*3))-(sqrt(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
return 1
@@ -0,0 +1,43 @@
/*
//////////////////////////////////////
Necrotizing Fasciitis (AKA Flesh-Eating Disease)
Very very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity temrendously.
Fatal Level.
Bonus
Deals brute damage over time.
//////////////////////////////////////
*/
/datum/symptom/flesh_eating
name = "Necrotizing Fasciitis"
stealth = -3
resistance = -4
stage_speed = 0
transmittable = -4
level = 6
severity = 5
/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(2,3)
M << "<span class='warning'>[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]</span>"
if(4,5)
M << "<span class='userdanger'>[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]</span>"
Flesheat(M, A)
return
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
var/get_damage = ((sqrt(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
@@ -0,0 +1,59 @@
/*
//////////////////////////////////////
DNA Saboteur
Very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
Cleans the DNA of a person and then randomly gives them a disability.
//////////////////////////////////////
*/
/datum/symptom/genetic_mutation
name = "Deoxyribonucleic Acid Saboteur"
stealth = -2
resistance = -3
stage_speed = 0
transmittable = -3
level = 6
severity = 3
var/list/possible_mutations
var/archived_dna = null
/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5)) // 15% chance
var/mob/living/carbon/M = A.affected_mob
if(!M.has_dna())
return
switch(A.stage)
if(4, 5)
M << "<span class='warning'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>"
M.dna.remove_mutation_group(possible_mutations)
randmut(M, possible_mutations)
return
// Archive their DNA before they were infected.
/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
possible_mutations = (bad_mutations | not_good_mutations) - mutations_list[RACEMUT]
var/mob/living/carbon/M = A.affected_mob
if(M)
if(!M.has_dna())
return
archived_dna = M.dna.struc_enzymes
// Give them back their old DNA when cured.
/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
var/mob/living/carbon/M = A.affected_mob
if(M && archived_dna)
if(!M.has_dna())
return
M.dna.struc_enzymes = archived_dna
M.domutcheck()
@@ -0,0 +1,41 @@
/*
//////////////////////////////////////
Hallucigen
Very noticable.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittable.
Critical Level.
Bonus
Makes the affected mob be hallucinated for short periods of time.
//////////////////////////////////////
*/
/datum/symptom/hallucigen
name = "Hallucigen"
stealth = -2
resistance = -3
stage_speed = -3
transmittable = -1
level = 5
severity = 3
/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2)
M << "<span class='warning'>[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]</span>"
if(3, 4)
M << "<span class='warning'><b>[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]</b></span>"
else
M << "<span class='userdanger'>[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]</span>"
M.hallucination += 5
return
@@ -0,0 +1,34 @@
/*
//////////////////////////////////////
Headache
Noticable.
Highly resistant.
Increases stage speed.
Not transmittable.
Low Level.
BONUS
Displays an annoying message!
Should be used for buffing your disease.
//////////////////////////////////////
*/
/datum/symptom/headache
name = "Headache"
stealth = -1
resistance = 4
stage_speed = 2
transmittable = 0
level = 1
severity = 1
/datum/symptom/headache/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
M << "<span class='warning'>[pick("Your head hurts.", "Your head starts pounding.")]</span>"
return
@@ -0,0 +1,158 @@
/*
//////////////////////////////////////
Healing
Little bit hidden.
Lowers resistance tremendously.
Decreases stage speed tremendously.
Decreases transmittablity temrendously.
Fatal Level.
Bonus
Heals toxins in the affected mob's blood stream.
//////////////////////////////////////
*/
/datum/symptom/heal
name = "Toxic Filter"
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
level = 6
/datum/symptom/heal/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Heal(M, A)
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand()))
M.adjustToxLoss(-get_damage)
return 1
/*
//////////////////////////////////////
Metabolism
Little bit hidden.
Lowers resistance.
Decreases stage speed.
Decreases transmittablity temrendously.
High Level.
Bonus
Cures all diseases (except itself) and creates anti-bodies for them until the symptom dies.
//////////////////////////////////////
*/
/datum/symptom/heal/metabolism
name = "Anti-Bodies Metabolism"
stealth = -1
resistance = -1
stage_speed = -1
transmittable = -4
level = 3
var/list/cured_diseases = list()
/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A)
var/cured = 0
for(var/datum/disease/D in M.viruses)
if(D != A)
cured = 1
cured_diseases += D.GetDiseaseID()
D.cure()
if(cured)
M << "<span class='notice'>You feel much better.</span>"
/datum/symptom/heal/metabolism/End(datum/disease/advance/A)
// Remove all the diseases we cured.
var/mob/living/M = A.affected_mob
if(istype(M))
if(cured_diseases.len)
for(var/res in M.resistances)
if(res in cured_diseases)
M.resistances -= res
M << "<span class='warning'>You feel weaker.</span>"
/*
//////////////////////////////////////
Longevity
Medium hidden boost.
Large resistance boost.
Large stage speed boost.
Large transmittablity boost.
High Level.
Bonus
After a certain amount of time the symptom will cure itself.
//////////////////////////////////////
*/
/datum/symptom/heal/longevity
name = "Longevity"
stealth = 3
resistance = 4
stage_speed = 4
transmittable = 4
level = 3
var/longevity = 30
/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/advance/A)
longevity -= 1
if(!longevity)
A.cure()
/datum/symptom/heal/longevity/Start(datum/disease/advance/A)
longevity = rand(initial(longevity) - 5, initial(longevity) + 5)
/*
/*
//////////////////////////////////////
DNA Restoration
Not well hidden.
Lowers resistance minorly.
Does not affect stage speed.
Decreases transmittablity greatly.
Very high level.
Bonus
Heals brain damage, treats radiation, cleans SE of non-power mutations.
//////////////////////////////////////
*/
/datum/symptom/heal/dna
name = "Deoxyribonucleic Acid Restoration"
stealth = -1
resistance = -1
stage_speed = 0
transmittable = -3
level = 5
/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand()))
M.adjustBrainLoss(-amt_healed)
//Non-power mutations, excluding race, so the virus does not force monkey -> human transformations.
var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT]
M.dna.remove_mutation_group(unclean_mutations)
M.radiation = max(M.radiation - 3, 0)
return 1
*/
@@ -0,0 +1,34 @@
/*
//////////////////////////////////////
Itching
Not noticable or unnoticable.
Resistant.
Increases stage speed.
Little transmittable.
Low Level.
BONUS
Displays an annoying message!
Should be used for buffing your disease.
//////////////////////////////////////
*/
/datum/symptom/itching
name = "Itching"
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 1
level = 1
severity = 1
/datum/symptom/itching/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
M << "<span class='warning'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>"
return
@@ -0,0 +1,38 @@
/*
//////////////////////////////////////
Self-Respiration
Slightly hidden.
Lowers resistance significantly.
Decreases stage speed significantly.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
The body generates salbutamol.
//////////////////////////////////////
*/
/datum/symptom/oxygen
name = "Self-Respiration"
stealth = 1
resistance = -3
stage_speed = -3
transmittable = -4
level = 6
/datum/symptom/oxygen/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if (M.reagents.get_reagent_amount("salbutamol") < 20)
M.reagents.add_reagent("salbutamol", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
M << "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>"
return
@@ -0,0 +1,103 @@
/*
//////////////////////////////////////
Sensory-Restoration
Very very very very noticable.
Lowers resistance tremendously.
Decreases stage speed tremendously.
Decreases transmittablity tremendously.
Fatal.
Bonus
The body generates Sensory restorational chemicals.
oculine for ears
antihol for removal of alcohol
synaptizine to purge sensory hallucigens
mannitol to kickstart the mind
//////////////////////////////////////
*/
/datum/symptom/sensory_restoration
name = "Sensory Restoration"
stealth = -1
resistance = -4
stage_speed = -4
transmittable = -3
level = 6
severity = 0
/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(2)
if(M.reagents.get_reagent_amount("oculine")<10)
M.reagents.add_reagent("oculine"=10)
M << "<span class='notice'>Your hearing feels clearer and crisp.</span>"
if(3)
if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 )
M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10))
M << "<span class='notice'>You feel sober.</span>"
if(4)
if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10)
M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5))
M << "<span class='notice'>You feel focused.</span>"
if(5)
if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10)
M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10))
M << "<span class='notice'>Your mind feels relaxed.</span>"
return
/*
//////////////////////////////////////
Sensory-Destruction
noticable.
Lowers resistance
Decreases stage speed tremendously.
Decreases transmittablity tremendously.
the drugs hit them so hard they have to focus on not dying
Bonus
The body generates Sensory destructive chemicals.
You cannot taste anything anymore.
ethanol for extremely drunk victim
lsd to break the mind
impedrezene to ruin the brain
//////////////////////////////////////
*/
/datum/symptom/sensory_destruction
name = "Sensory destruction"
stealth = -1
resistance = -2
stage_speed = -3
transmittable = -4
level = 6
severity = 5
/datum/symptom/sensory_destruction/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
M << "<span class='warning'><b>You can't taste a thing.</b></span>"
if(2)
M << "<span class='warning'><b>You can't feel anything.</b></span>"
if(prob(10))
M.reagents.add_reagent("morphine",rand(5,7))
if(3)
M.reagents.add_reagent("ethanol",rand(5,7))
M << "<span class='warning'><b>You feel absolutely hammered.</b></span>"
if(prob(15))
M.reagents.add_reagent("morphine",rand(5,7))
if(4)
M.reagents.add_reagent_list(list("ethanol",rand(7,15),"lsd",rand(5,10)))
M << "<span class='warning'><b>You try to focus on not dying.</b></span>"
if(prob(20))
M.reagents.add_reagent("morphine",rand(5,7))
if(5)
M.reagents.add_reagent_list(list("haloperidol",rand(5,15),"ethanol",rand(7,20),"lsd",rand(5,15)))
M << "<span class='warning'><b>u can count 2 potato!</b></span>"
if(prob(25))
M.reagents.add_reagent("morphine",rand(5,7))
return
@@ -0,0 +1,48 @@
/*
//////////////////////////////////////
Alopecia
Noticable.
Decreases resistance slightly.
Reduces stage speed slightly.
Transmittable.
Intense Level.
BONUS
Makes the mob lose hair.
//////////////////////////////////////
*/
/datum/symptom/shedding
name = "Alopecia"
stealth = -1
resistance = -1
stage_speed = -1
transmittable = 2
level = 4
severity = 1
/datum/symptom/shedding/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
M << "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flakey.")]</span>"
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
switch(A.stage)
if(3, 4)
if(!(H.h_style == "Bald") && !(H.h_style == "Balding Hair"))
H << "<span class='warning'>Your hair starts to fall out in clumps...</span>"
spawn(50)
H.h_style = "Balding Hair"
H.update_hair()
if(5)
if(!(H.f_style == "Shaved") || !(H.h_style == "Bald"))
H << "<span class='warning'>Your hair starts to fall out in clumps...</span>"
spawn(50)
H.f_style = "Shaved"
H.h_style = "Bald"
H.update_hair()
return
@@ -0,0 +1,40 @@
/*
//////////////////////////////////////
Shivering
No change to hidden.
Increases resistance.
Increases stage speed.
Little transmittable.
Low level.
Bonus
Cools down your body.
//////////////////////////////////////
*/
/datum/symptom/shivering
name = "Shivering"
stealth = 0
resistance = 2
stage_speed = 2
transmittable = 2
level = 2
severity = 2
/datum/symptom/shivering/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
M << "<span class='warning'>[pick("You feel cold.", "You start shivering.")]</span>"
if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(M, A)
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
@@ -0,0 +1,86 @@
/*
//////////////////////////////////////
Vitiligo
Extremely Noticable.
Decreases resistance slightly.
Reduces stage speed slightly.
Reduces transmission.
Critical Level.
BONUS
Makes the mob lose skin pigmentation.
//////////////////////////////////////
*/
/datum/symptom/vitiligo
name = "Vitiligo"
stealth = -3
resistance = -1
stage_speed = -1
transmittable = -2
level = 4
severity = 1
/datum/symptom/vitiligo/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.s_tone == -85)
return
switch(A.stage)
if(5)
H.s_tone = -85
H.update_body(0)
else
H.visible_message("<span class='warning'>[H] looks a bit pale...</span>", "<span class='notice'>Your skin suddenly appears lighter...</span>")
return
/*
//////////////////////////////////////
Revitiligo
Extremely Noticable.
Decreases resistance slightly.
Reduces stage speed slightly.
Reduces transmission.
Critical Level.
BONUS
Makes the mob gain skin pigmentation.
//////////////////////////////////////
*/
/datum/symptom/revitiligo
name = "Revitiligo"
stealth = -3
resistance = -1
stage_speed = -1
transmittable = -2
level = 4
severity = 1
/datum/symptom/revitiligo/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.s_tone == 85)
return
switch(A.stage)
if(5)
H.s_tone = 85
H.update_body(0)
else
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
return
@@ -0,0 +1,39 @@
/*
//////////////////////////////////////
Sneezing
Very Noticable.
Increases resistance.
Doesn't increase stage speed.
Very transmittable.
Low Level.
Bonus
Forces a spread type of AIRBORNE
with extra range!
//////////////////////////////////////
*/
/datum/symptom/sneeze
name = "Sneezing"
stealth = -2
resistance = 3
stage_speed = 0
transmittable = 4
level = 1
severity = 1
/datum/symptom/sneeze/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
M.emote("sniff")
else
M.emote("sneeze")
A.spread(A.holder, 5)
return
@@ -0,0 +1,38 @@
/*
//////////////////////////////////////
Stimulant //gotta go fast
Noticable.
Lowers resistance significantly.
Decreases stage speed moderately..
Decreases transmittablity tremendously.
Moderate Level.
Bonus
The body generates Ephedrine.
//////////////////////////////////////
*/
/datum/symptom/stimulant
name = "Stimulant"
stealth = -1
resistance = -3
stage_speed = -2
transmittable = -4
level = 3
/datum/symptom/stimulant/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(5)
if (M.reagents.get_reagent_amount("ephedrine") < 10)
M.reagents.add_reagent("ephedrine", 10)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
M << "<span class='notice'>[pick("You feel restless.", "You feel like running laps around the station.")]</span>"
return
@@ -0,0 +1,40 @@
// Symptoms are the effects that engineered advanced diseases do.
var/list/list_symptoms = subtypesof(/datum/symptom)
var/list/dictionary_symptoms = list()
var/global/const/SYMPTOM_ACTIVATION_PROB = 3
/datum/symptom
// Buffs/Debuffs the symptom has to the overall engineered disease.
var/name = ""
var/stealth = 0
var/resistance = 0
var/stage_speed = 0
var/transmittable = 0
// The type level of the symptom. Higher is harder to generate.
var/level = 0
// The severity level of the symptom. Higher is more dangerous.
var/severity = 0
// The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!!
var/id = ""
/datum/symptom/New()
var/list/S = list_symptoms
for(var/i = 1; i <= S.len; i++)
if(src.type == S[i])
id = "[i]"
return
CRASH("We couldn't assign an ID!")
// Called when processing of the advance disease, which holds this symptom, starts.
/datum/symptom/proc/Start(datum/disease/advance/A)
return
// Called when the advance disease is going to be deleted or when the advance disease stops processing.
/datum/symptom/proc/End(datum/disease/advance/A)
return
/datum/symptom/proc/Activate(datum/disease/advance/A)
return
@@ -0,0 +1,65 @@
/*
//////////////////////////////////////
Viral adaptation
Moderate stealth boost.
Major Increases to resistance.
Reduces stage speed.
No change to transmission
Critical Level.
BONUS
Extremely useful for buffing viruses
//////////////////////////////////////
*/
/datum/symptom/viraladaptation
name = "Viral self-adaptation"
stealth = 3
resistance = 5
stage_speed = -3
transmittable = 0
level = 3
/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
M << "<span class='notice'>You feel off, but no different from before.</span>"
if(5)
M << "<span class='notice'>You feel better, but nothing interesting happens.</span>"
/*
//////////////////////////////////////
Viral evolution
Moderate stealth reductopn.
Major decreases to resistance.
increases stage speed.
increase to transmission
Critical Level.
BONUS
Extremely useful for buffing viruses
//////////////////////////////////////
*/
/datum/symptom/viralevolution
name = "Viral evolutionary acceleration"
stealth = -2
resistance = -3
stage_speed = 5
transmittable = 3
level = 3
/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
M << "<span class='notice'>You feel better, but no different from before.</span>"
if(5)
M << "<span class='notice'>You feel off, but nothing interesting happens.</span>"
@@ -0,0 +1,87 @@
/*
//////////////////////////////////////
Hyphema (Eye bleeding)
Slightly noticable.
Lowers resistance tremendously.
Decreases stage speed tremendously.
Decreases transmittablity.
Critical Level.
Bonus
Causes blindness.
//////////////////////////////////////
*/
/datum/symptom/visionloss
name = "Hyphema"
stealth = -1
resistance = -4
stage_speed = -4
transmittable = -3
level = 5
severity = 4
/datum/symptom/visionloss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
M << "<span class='warning'>Your eyes itch.</span>"
if(3, 4)
M << "<span class='warning'><b>Your eyes burn!</b></span>"
M.blur_eyes(10)
M.adjust_eye_damage(1)
else
M << "<span class='userdanger'>Your eyes burn horrificly!</span>"
M.blur_eyes(20)
M.adjust_eye_damage(5)
if(M.eye_damage >= 10)
M.become_nearsighted()
if(prob(M.eye_damage - 10 + 1))
if(M.become_blind())
M << "<span class='userdanger'>You go blind!</span>"
/*
//////////////////////////////////////
Ocular Restoration
Noticable.
Lowers resistance significantly.
Decreases stage speed moderately..
Decreases transmittablity tremendously.
High level.
Bonus
Restores eyesight.
//////////////////////////////////////
*/
/datum/symptom/visionaid
name = "Ocular Restoration"
stealth = -1
resistance = -3
stage_speed = -2
transmittable = -4
level = 4
/datum/symptom/visionaid/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if (M.reagents.get_reagent_amount("oculine") < 20)
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
M << "<span class='notice'>[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]</span>"
return
@@ -0,0 +1,48 @@
/*
//////////////////////////////////////
Voice Change
Very Very noticable.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittable.
Fatal Level.
Bonus
Changes the voice of the affected mob. Causing confusion in communication.
//////////////////////////////////////
*/
/datum/symptom/voice_change
name = "Voice Change"
stealth = -2
resistance = -3
stage_speed = -3
transmittable = -1
level = 6
severity = 2
/datum/symptom/voice_change/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='warning'>[pick("Your throat hurts.", "You clear your throat.")]</span>"
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.SetSpecialVoice(H.species.get_random_name(H.gender))
return
/datum/symptom/voice_change/End(datum/disease/advance/A)
..()
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
H.UnsetSpecialVoice()
return
@@ -0,0 +1,106 @@
/*
//////////////////////////////////////
Vomiting
Very Very Noticable.
Decreases resistance.
Doesn't increase stage speed.
Little transmittable.
Medium Level.
Bonus
Forces the affected mob to vomit!
Meaning your disease can spread via
people walking on vomit.
Makes the affected mob lose nutrition and
heal toxin damage.
//////////////////////////////////////
*/
/datum/symptom/vomit
name = "Vomiting"
stealth = -2
resistance = -1
stage_speed = 0
transmittable = 1
level = 3
severity = 4
/datum/symptom/vomit/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB / 2))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='warning'>[pick("You feel nauseous.", "You feel like you're going to throw up!")]</span>"
else
Vomit(M)
return
/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M)
M.vomit(20)
/*
//////////////////////////////////////
Vomiting Blood
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Little transmittable.
Intense level.
Bonus
Forces the affected mob to vomit blood!
Meaning your disease can spread via
people walking on the blood.
Makes the affected mob lose health.
//////////////////////////////////////
*/
/datum/symptom/vomit/blood
name = "Blood Vomiting"
stealth = -2
resistance = -1
stage_speed = -1
transmittable = 1
level = 4
severity = 5
/datum/symptom/vomit/blood/Vomit(mob/living/carbon/M)
M.vomit(0, 1)
/*
//////////////////////////////////////
Projectile Vomiting
Very Very Noticable.
Decreases resistance.
Doesn't increase stage speed.
Little transmittable.
Medium Level.
Bonus
As normal vomiting, except it will spread further,
likely causing more to walk across the vomit.
//////////////////////////////////////
*/
/datum/symptom/vomit/projectile
name = "Projectile Vomiting"
stealth = -2
level = 4
/datum/symptom/vomit/projectile/Vomit(mob/living/carbon/M)
M.vomit(6,0,1,5,1)
@@ -0,0 +1,44 @@
/*
//////////////////////////////////////
Weakness
Slightly noticeable.
Lowers resistance slightly.
Decreases stage speed moderately.
Decreases transmittablity moderately.
Moderate Level.
Bonus
Deals stamina damage to the host
//////////////////////////////////////
*/
/datum/symptom/weakness
name = "Weakness"
stealth = -1
resistance = -1
stage_speed = -2
transmittable = -2
level = 3
severity = 3
/datum/symptom/weakness/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
M << "<span class='warning'>[pick("You feel weak.", "You feel lazy.")]</span>"
if(3, 4)
M << "<span class='warning'><b>[pick("You feel very frail.", "You think you might faint.")]</span>"
M.adjustStaminaLoss(15)
else
M << "<span class='userdanger'>[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]</span>"
M.adjustStaminaLoss(30)
if(M.getStaminaLoss() > 60 && !M.stat)
M.visible_message("<span class='warning'>[M] faints!</span>", "<span class='userdanger'>You swoon and faint...</span>")
M.AdjustSleeping(5)
return
@@ -0,0 +1,121 @@
/*
//////////////////////////////////////
Weight Gain
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced transmittable.
Intense Level.
Bonus
Increases the weight gain of the mob,
forcing it to eventually turn fat.
//////////////////////////////////////
*/
/datum/symptom/weight_gain
name = "Weight Gain"
stealth = -3
resistance = -3
stage_speed = -2
transmittable = -2
level = 4
severity = 1
/datum/symptom/weight_gain/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='warning'>[pick("You feel blubbery.", "Your stomach hurts.")]</span>"
else
M.overeatduration = min(M.overeatduration + 100, 600)
M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL)
return
/*
//////////////////////////////////////
Weight Loss
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced Transmittable.
High level.
Bonus
Decreases the weight of the mob,
forcing it to be skinny.
//////////////////////////////////////
*/
/datum/symptom/weight_loss
name = "Weight Loss"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -2
level = 3
severity = 1
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='warning'>[pick("You feel hungry.", "You crave for food.")]</span>"
else
M << "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>"
M.overeatduration = max(M.overeatduration - 100, 0)
M.nutrition = max(M.nutrition - 100, 0)
return
/*
//////////////////////////////////////
Weight Even
Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced transmittable.
High level.
Bonus
Causes the weight of the mob to
be even, meaning eating isn't
required anymore.
//////////////////////////////////////
*/
/datum/symptom/weight_even
name = "Weight Even"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -2
level = 4
/datum/symptom/weight_even/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.overeatduration = 0
M.nutrition = NUTRITION_LEVEL_WELL_FED + 50
return
@@ -0,0 +1,55 @@
/*
//////////////////////////////////////
Eternal Youth
Moderate stealth boost.
Increases resistance tremendously.
Increases stage speed tremendously.
Reduces transmission tremendously.
Critical Level.
BONUS
Gives you immortality and eternal youth!!!
Can be used to buff your virus
//////////////////////////////////////
*/
/datum/symptom/youth
name = "Eternal Youth"
stealth = 3
resistance = 4
stage_speed = 4
transmittable = -4
level = 5
/datum/symptom/youth/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 2))
var/mob/living/M = A.affected_mob
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
switch(A.stage)
if(1)
if(H.age > 41)
H.age = 41
H << "<span class='notice'>You haven't had this much energy in years!</span>"
if(2)
if(H.age > 36)
H.age = 36
H << "<span class='notice'>You're suddenly in a good mood.</span>"
if(3)
if(H.age > 31)
H.age = 31
H << "<span class='notice'>You begin to feel more lithe.</span>"
if(4)
if(H.age > 26)
H.age = 26
H << "<span class='notice'>You feel reinvigorated.</span>"
if(5)
if(H.age > 21)
H.age = 21
H << "<span class='notice'>You feel like you can take on the world!</span>"
return
+41
View File
@@ -0,0 +1,41 @@
/datum/disease/anxiety
name = "Severe Anxiety"
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Ethanol"
cures = list("ethanol")
agent = "Excess Lepidopticides"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate butterflies."
severity = MEDIUM
/datum/disease/anxiety/stage_act()
..()
switch(stage)
if(2) //also changes say, see say.dm
if(prob(5))
affected_mob << "<span class='notice'>You feel anxious.</span>"
if(3)
if(prob(10))
affected_mob << "<span class='notice'>Your stomach flutters.</span>"
if(prob(5))
affected_mob << "<span class='notice'>You feel panicky.</span>"
if(prob(2))
affected_mob << "<span class='danger'>You're overtaken with panic!</span>"
affected_mob.confused += (rand(2,3))
if(4)
if(prob(10))
affected_mob << "<span class='danger'>You feel butterflies in your stomach.</span>"
if(prob(5))
affected_mob.visible_message("<span class='danger'>[affected_mob] stumbles around in a panic.</span>", \
"<span class='userdanger'>You have a panic attack!</span>")
affected_mob.confused += (rand(6,8))
affected_mob.jitteriness += (rand(6,8))
if(prob(2))
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up butterflies!</span>", \
"<span class='userdanger'>You cough up butterflies!</span>")
new /mob/living/simple_animal/butterfly(affected_mob.loc)
new /mob/living/simple_animal/butterfly(affected_mob.loc)
return
+34
View File
@@ -0,0 +1,34 @@
/datum/disease/appendicitis
form = "Condition"
name = "Appendicitis"
max_stages = 3
cure_text = "Surgery"
agent = "Shitty Appendix"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
desc = "If left untreated the subject will become very weak, and may vomit often."
severity = "Dangerous!"
longevity = 1000
disease_flags = CAN_CARRY|CAN_RESIST
spread_flags = NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/internal/appendix)
/datum/disease/appendicitis/stage_act()
..()
switch(stage)
if(1)
if(prob(5))
affected_mob.emote("cough")
if(2)
var/obj/item/organ/internal/appendix/A = affected_mob.get_int_organ(/obj/item/organ/internal/appendix)
if(A)
A.inflamed = 1
A.update_icon()
if(prob(3))
affected_mob << "<span class='warning'>You feel a stabbing pain in your abdomen!</span>"
affected_mob.Stun(rand(2,3))
affected_mob.adjustToxLoss(1)
if(3)
if(prob(1))
affected_mob.vomit(95)
+40
View File
@@ -0,0 +1,40 @@
/datum/disease/beesease
name = "Beesease"
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Sugar"
cures = list("sugar")
agent = "Apidae Infection"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate bees."
severity = DANGEROUS
/datum/disease/beesease/stage_act()
..()
switch(stage)
if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey
if(prob(2))
affected_mob << "<span class='notice'>You taste honey in your mouth.</span>"
if(3)
if(prob(10))
affected_mob << "<span class='notice'>Your stomach rumbles.</span>"
if(prob(2))
affected_mob << "<span class='danger'>Your stomach stings painfully.</span>"
if(prob(20))
affected_mob.adjustToxLoss(2)
affected_mob.updatehealth()
if(4)
if(prob(10))
affected_mob.visible_message("<span class='danger'>[affected_mob] buzzes.</span>", \
"<span class='userdanger'>Your stomach buzzes violently!</span>")
if(prob(5))
affected_mob << "<span class='danger'>You feel something moving in your throat.</span>"
if(prob(1))
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up a swarm of bees!</span>", \
"<span class='userdanger'>You cough up a swarm of bees!</span>")
new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc)
//if(5)
//Plus if you die, you explode into bees
return
+59
View File
@@ -0,0 +1,59 @@
/datum/disease/brainrot
name = "Brainrot"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Mannitol"
cures = list("mannitol")
agent = "Cryptococcus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 15//higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/external/head)
severity = DANGEROUS
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
..()
switch(stage)
if(2)
if(prob(2))
affected_mob.emote("blink")
if(prob(2))
affected_mob.emote("yawn")
if(prob(2))
affected_mob << "<span class='danger'>You don't feel like yourself.</span>"
if(prob(5))
affected_mob.adjustBrainLoss(1)
affected_mob.updatehealth()
if(3)
if(prob(2))
affected_mob.emote("stare")
if(prob(2))
affected_mob.emote("drool")
if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't retard you to death now
affected_mob.adjustBrainLoss(2)
affected_mob.updatehealth()
if(prob(2))
affected_mob << "<span class='danger'>Your try to remember something important...but can't.</span>"
if(4)
if(prob(2))
affected_mob.emote("stare")
if(prob(2))
affected_mob.emote("drool")
if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now
affected_mob.adjustBrainLoss(3)
affected_mob.updatehealth()
if(prob(2))
affected_mob << "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>"
if(prob(3))
affected_mob << "<span class='danger'>You lose consciousness...</span>"
affected_mob.visible_message("<span class='warning'>[affected_mob] suddenly collapses</span>")
affected_mob.Paralyse(rand(5,10))
if(prob(1))
affected_mob.emote("snore")
if(prob(15))
affected_mob.stuttering += 3
return
+66
View File
@@ -0,0 +1,66 @@
/datum/disease/cold
name = "The Cold"
max_stages = 3
spread_flags = AIRBORNE
cure_text = "Rest & Spaceacillin"
cures = list("spaceacillin")
agent = "XY-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.5
desc = "If left untreated the subject will contract the flu."
severity = MINOR
/datum/disease/cold/stage_act()
..()
switch(stage)
if(2)
/*
if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed
affected_mob << "\blue You feel better."
cure()
return
*/
if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if(prob(1) && prob(5))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your throat feels sore.</span>"
if(prob(1))
affected_mob << "<span class='danger'>Mucous runs down the back of your throat.</span>"
if(3)
/*
if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed
affected_mob << "\blue You feel better."
cure()
return
*/
if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if(prob(1) && prob(1))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your throat feels sore.</span>"
if(prob(1))
affected_mob << "<span class='danger'>Mucous runs down the back of your throat.</span>"
if(prob(1) && prob(50))
if(!affected_mob.resistances.Find(/datum/disease/flu))
var/datum/disease/Flu = new /datum/disease/flu(0)
affected_mob.ContractDisease(Flu)
cure()
+39
View File
@@ -0,0 +1,39 @@
/datum/disease/cold9
name = "The Cold"
max_stages = 3
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Common Cold Anti-bodies & Spaceacillin"
cures = list("spaceacillin")
agent = "ICE9-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated the subject will slow, as if partly frozen."
severity = MEDIUM
/datum/disease/cold9/stage_act()
..()
switch(stage)
if(2)
affected_mob.bodytemperature -= 10
if(prob(1) && prob(10))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your throat feels sore.</span>"
if(prob(5))
affected_mob << "<span class='danger'>You feel stiff.</span>"
if(3)
affected_mob.bodytemperature -= 20
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your throat feels sore.</span>"
if(prob(10))
affected_mob << "<span class='danger'>You feel stiff.</span>"
+72
View File
@@ -0,0 +1,72 @@
/datum/disease/dnaspread
name = "Space Retrovirus"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Mutadone"
cures = list("mutadone")
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
agent = "S4E1 retrovirus"
viable_mobtypes = list(/mob/living/carbon/human)
var/datum/dna/original_dna = null
var/transformed = 0
desc = "This disease transplants the genetic code of the initial vector into new hosts."
severity = MEDIUM
/datum/disease/dnaspread/stage_act()
..()
if(!affected_mob.dna)
cure()
if(!strain_data["dna"])
//Absorbs the target DNA.
strain_data["dna"] = new affected_mob.dna.type
affected_mob.dna.copy_dna(strain_data["dna"])
src.carrier = 1
src.stage = 4
return
switch(stage)
if(2 || 3) //Pretend to be a cold and give time to spread.
if(prob(8))
affected_mob.emote("sneeze")
if(prob(8))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your muscles ache.</span>"
if(prob(20))
affected_mob.take_organ_damage(1)
if(prob(1))
affected_mob << "<span class='danger'>Your stomach hurts.</span>"
if(prob(20))
affected_mob.adjustToxLoss(2)
affected_mob.updatehealth()
if(4)
if(!transformed && !carrier)
//Save original dna for when the disease is cured.
original_dna = new affected_mob.dna.type
affected_mob.dna.copy_dna(original_dna)
affected_mob << "<span class='danger'>You don't feel like yourself..</span>"
var/datum/dna/transform_dna = strain_data["dna"]
transform_dna.transfer_identity(affected_mob, transfer_SE = 1)
affected_mob.real_name = affected_mob.dna.real_name
affected_mob.updateappearance(mutcolor_update=1)
affected_mob.domutcheck()
transformed = 1
carrier = 1 //Just chill out at stage 4
return
/datum/disease/dnaspread/Destroy()
if (original_dna && transformed && affected_mob)
original_dna.transfer_identity(affected_mob, transfer_SE = 1)
affected_mob.real_name = affected_mob.dna.real_name
affected_mob.updateappearance(mutcolor_update=1)
affected_mob.domutcheck()
affected_mob << "<span class='notice'>You feel more like yourself.</span>"
return ..()
+32
View File
@@ -0,0 +1,32 @@
/datum/disease/fake_gbs
name = "GBS"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Diphenhydramine & Sulfur"
cures = list("diphenhydramine","sulfur")
agent = "Gravitokinetic Bipotential SADS-"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated death will occur."
severity = BIOHAZARD
/datum/disease/fake_gbs/stage_act()
..()
switch(stage)
if(2)
if(prob(1))
affected_mob.emote("sneeze")
if(3)
if(prob(5))
affected_mob.emote("cough")
else if(prob(5))
affected_mob.emote("gasp")
if(prob(10))
affected_mob << "<span class='danger'>You're starting to feel very weak...</span>"
if(4)
if(prob(10))
affected_mob.emote("cough")
if(5)
if(prob(10))
affected_mob.emote("cough")
+54
View File
@@ -0,0 +1,54 @@
/datum/disease/flu
name = "The Flu"
max_stages = 3
spread_text = "Airborne"
cure_text = "Spaceacillin"
cures = list("spaceacillin")
cure_chance = 10
agent = "H13N1 flu virion"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
severity = MEDIUM
/datum/disease/flu/stage_act()
..()
switch(stage)
if(2)
if(affected_mob.lying && prob(20))
affected_mob << "<span class='notice'>You feel better.</span>"
stage--
return
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your muscles ache.</span>"
if(prob(20))
affected_mob.take_organ_damage(1)
if(prob(1))
affected_mob << "<span class='danger'>Your stomach hurts.</span>"
if(prob(20))
affected_mob.adjustToxLoss(1)
affected_mob.updatehealth()
if(3)
if(affected_mob.lying && prob(15))
affected_mob << "<span class='notice'>You feel better.</span>"
stage--
return
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your muscles ache.</span>"
if(prob(20))
affected_mob.take_organ_damage(1)
if(prob(1))
affected_mob << "<span class='danger'>Your stomach hurts.</span>"
if(prob(20))
affected_mob.adjustToxLoss(1)
affected_mob.updatehealth()
return
+36
View File
@@ -0,0 +1,36 @@
/datum/disease/fluspanish
name = "Spanish inquisition Flu"
max_stages = 3
spread_text = "Airborne"
cure_text = "Spaceacillin & Anti-bodies to the common flu"
cures = list("spaceacillin")
cure_chance = 10
agent = "1nqu1s1t10n flu virion"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will burn to death for being a heretic."
severity = DANGEROUS
/datum/disease/fluspanish/stage_act()
..()
switch(stage)
if(2)
affected_mob.bodytemperature += 10
if(prob(5))
affected_mob.emote("sneeze")
if(prob(5))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>You're burning in your own skin!</span>"
affected_mob.take_organ_damage(0,5)
if(3)
affected_mob.bodytemperature += 20
if(prob(5))
affected_mob.emote("sneeze")
if(prob(5))
affected_mob.emote("cough")
if(prob(5))
affected_mob << "<span class='danger'>You're burning in your own skin!</span>"
affected_mob.take_organ_damage(0,5)
return
+41
View File
@@ -0,0 +1,41 @@
/datum/disease/gbs
name = "GBS"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Diphenhydramine & Sulfur"
cures = list("diphenhydramine","sulfur")
cure_chance = 15//higher chance to cure, since two reagents are required
agent = "Gravitokinetic Bipotential SADS+"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 1
severity = BIOHAZARD
/datum/disease/gbs/stage_act()
..()
switch(stage)
if(2)
if(prob(45))
affected_mob.adjustToxLoss(5)
affected_mob.updatehealth()
if(prob(1))
affected_mob.emote("sneeze")
if(3)
if(prob(5))
affected_mob.emote("cough")
else if(prob(5))
affected_mob.emote("gasp")
if(prob(10))
affected_mob << "<span class='danger'>You're starting to feel very weak...</span>"
if(4)
if(prob(10))
affected_mob.emote("cough")
affected_mob.adjustToxLoss(5)
affected_mob.updatehealth()
if(5)
affected_mob << "<span class='danger'>Your body feels as if it's trying to rip itself open...</span>"
if(prob(50))
affected_mob.gib()
else
return
+63
View File
@@ -0,0 +1,63 @@
/datum/disease/magnitis
name = "Magnitis"
max_stages = 4
spread_text = "Airborne"
cure_text = "Iron"
cures = list("iron")
agent = "Fukkos Miracos"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 0.75
desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
severity = MEDIUM
/datum/disease/magnitis/stage_act()
..()
switch(stage)
if(2)
if(prob(2))
affected_mob << "<span class='danger'>You feel a slight shock course through your body.</span>"
if(prob(2))
for(var/obj/M in orange(2,affected_mob))
if(!M.anchored && (M.flags & CONDUCT))
step_towards(M,affected_mob)
for(var/mob/living/silicon/S in orange(2,affected_mob))
if(istype(S, /mob/living/silicon/ai)) continue
step_towards(S,affected_mob)
if(3)
if(prob(2))
affected_mob << "<span class='danger'>You feel a strong shock course through your body.</span>"
if(prob(2))
affected_mob << "<span class='danger'>You feel like clowning around.</span>"
if(prob(4))
for(var/obj/M in orange(4,affected_mob))
if(!M.anchored && (M.flags & CONDUCT))
var/i
var/iter = rand(1,2)
for(i=0,i<iter,i++)
step_towards(M,affected_mob)
for(var/mob/living/silicon/S in orange(4,affected_mob))
if(istype(S, /mob/living/silicon/ai)) continue
var/i
var/iter = rand(1,2)
for(i=0,i<iter,i++)
step_towards(S,affected_mob)
if(4)
if(prob(2))
affected_mob << "<span class='danger'>You feel a powerful shock course through your body.</span>"
if(prob(2))
affected_mob << "<span class='danger'>You query upon the nature of miracles.</span>"
if(prob(8))
for(var/obj/M in orange(6,affected_mob))
if(!M.anchored && (M.flags & CONDUCT))
var/i
var/iter = rand(1,3)
for(i=0,i<iter,i++)
step_towards(M,affected_mob)
for(var/mob/living/silicon/S in orange(6,affected_mob))
if(istype(S, /mob/living/silicon/ai)) continue
var/i
var/iter = rand(1,3)
for(i=0,i<iter,i++)
step_towards(S,affected_mob)
return
+25
View File
@@ -0,0 +1,25 @@
/datum/disease/pierrot_throat
name = "Pierrot's Throat"
max_stages = 4
spread_text = "Airborne"
cure_text = "Banana products, especially banana bread."
cures = list("banana")
cure_chance = 75
agent = "H0NI<42 Virus"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will probably drive others to insanity."
severity = MEDIUM
longevity = 400
/datum/disease/pierrot_throat/stage_act()
..()
switch(stage)
if(1)
if(prob(10)) affected_mob << "<span class='danger'>You feel a little silly.</span>"
if(2)
if(prob(10)) affected_mob << "<span class='danger'>You start seeing rainbows.</span>"
if(3)
if(prob(10)) affected_mob << "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>"
if(4)
if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
+83
View File
@@ -0,0 +1,83 @@
/datum/disease/dna_retrovirus
name = "Retrovirus"
max_stages = 4
spread_text = "Contact"
spread_flags = CONTACT_GENERAL
cure_text = "Rest or an injection of mutadone"
cure_chance = 6
agent = ""
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
severity = DANGEROUS
permeability_mod = 0.4
stage_prob = 2
var/SE
var/UI
var/restcure = 0
/datum/disease/dna_retrovirus/New()
..()
agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]"
if(prob(40))
cures = list("mutadone")
else
restcure = 1
/datum/disease/dna_retrovirus/stage_act()
..()
switch(stage)
if(1)
if(restcure)
if(affected_mob.lying && prob(30))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if (prob(8))
affected_mob << "<span class='danger'>Your head hurts.</span>"
if (prob(9))
affected_mob << "You feel a tingling sensation in your chest."
if (prob(9))
affected_mob << "<span class='danger'>You feel angry.</span>"
if(2)
if(restcure)
if(affected_mob.lying && prob(20))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if (prob(8))
affected_mob << "<span class='danger'>Your skin feels loose.</span>"
if (prob(10))
affected_mob << "You feel very strange."
if (prob(4))
affected_mob << "<span class='danger'>You feel a stabbing pain in your head!</span>"
affected_mob.Paralyse(2)
if (prob(4))
affected_mob << "<span class='danger'>Your stomach churns.</span>"
if(3)
if(restcure)
if(affected_mob.lying && prob(20))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if (prob(10))
affected_mob << "<span class='danger'>Your entire body vibrates.</span>"
if (prob(35))
if(prob(50))
scramble(1, affected_mob, rand(15, 45))
else
scramble(0, affected_mob, rand(15, 45))
if(4)
if(restcure)
if(affected_mob.lying && prob(5))
affected_mob << "<span class='notice'>You feel better.</span>"
cure()
return
if (prob(60))
if(prob(50))
scramble(1, affected_mob, rand(15, 45))
else
scramble(0, affected_mob, rand(15, 45))
+52
View File
@@ -0,0 +1,52 @@
/datum/disease/rhumba_beat
name = "The Rhumba Beat"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
cure_text = "Chick Chicky Boom!"
cures = list("plasma")
agent = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
severity = BIOHAZARD
/datum/disease/rhumba_beat/stage_act()
..()
switch(stage)
if(1)
if(affected_mob.ckey == "rosham")
src.cure()
if(2)
if(affected_mob.ckey == "rosham")
src.cure()
if(prob(45))
affected_mob.adjustToxLoss(5)
affected_mob.updatehealth()
if(prob(1))
affected_mob << "<span class='danger'>You feel strange...</span>"
if(3)
if(affected_mob.ckey == "rosham")
src.cure()
if(prob(5))
affected_mob << "<span class='danger'>You feel the urge to dance...</span>"
else if(prob(5))
affected_mob.emote("gasp")
else if(prob(10))
affected_mob << "<span class='danger'>You feel the need to chick chicky boom...</span>"
if(4)
if(affected_mob.ckey == "rosham")
src.cure()
if(prob(10))
affected_mob.emote("gasp")
affected_mob << "<span class='danger'>You feel a burning beat inside...</span>"
if(prob(20))
affected_mob.adjustToxLoss(5)
affected_mob.updatehealth()
if(5)
if(affected_mob.ckey == "rosham")
src.cure()
affected_mob << "<span class='danger'>Your body is unable to contain the Rhumba Beat...</span>"
if(prob(50))
affected_mob.gib()
else
return
+243
View File
@@ -0,0 +1,243 @@
/datum/disease/transformation
name = "Transformation"
max_stages = 5
spread_text = "Acute"
spread_flags = SPECIAL
cure_text = "A coder's love (theoretical)."
agent = "Shenanigans"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
severity = HARMFUL
stage_prob = 10
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
disease_flags = CURABLE
var/list/stage1 = list("You feel unremarkable.")
var/list/stage2 = list("You feel boring.")
var/list/stage3 = list("You feel utterly plain.")
var/list/stage4 = list("You feel white bread.")
var/list/stage5 = list("Oh the humanity!")
var/new_form = /mob/living/carbon/human
/datum/disease/transformation/stage_act()
..()
switch(stage)
if(1)
if (prob(stage_prob) && stage1)
affected_mob << pick(stage1)
if(2)
if (prob(stage_prob) && stage2)
affected_mob << pick(stage2)
if(3)
if (prob(stage_prob*2) && stage3)
affected_mob << pick(stage3)
if(4)
if (prob(stage_prob*2) && stage4)
affected_mob << pick(stage4)
if(5)
do_disease_transformation(affected_mob)
/datum/disease/transformation/proc/do_disease_transformation(mob/living/affected_mob)
if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD)
if(stage5)
affected_mob << pick(stage5)
if(jobban_isbanned(affected_mob, new_form))
affected_mob.death(1)
return
if(affected_mob.notransform)
return
affected_mob.notransform = 1
affected_mob.canmove = 0
affected_mob.icon = null
affected_mob.overlays.Cut()
affected_mob.invisibility = 101
for(var/obj/item/W in affected_mob)
if(istype(W, /obj/item/weapon/implant))
qdel(W)
continue
W.layer = initial(W.layer)
W.loc = affected_mob.loc
W.dropped(affected_mob)
var/mob/living/new_mob = new new_form(affected_mob.loc)
if(istype(new_mob))
new_mob.a_intent = "harm"
if(affected_mob.mind)
affected_mob.mind.transfer_to(new_mob)
else
new_mob.key = affected_mob.key
qdel(affected_mob)
/datum/disease/transformation/jungle_fever
name = "Jungle Fever"
cure_text = "Bananas"
cures = list("banana")
spread_text = "Monkey Bites"
spread_flags = SPECIAL
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
cure_chance = 1
disease_flags = CAN_CARRY|CAN_RESIST
longevity = 30
desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
severity = BIOHAZARD
stage_prob = 4
visibility_flags = 0
agent = "Kongey Vibrion M-909"
new_form = /mob/living/carbon/human/monkey
stage1 = null
stage2 = null
stage3 = null
stage4 = list("<span class='warning'>Your back hurts.</span>", "<span class='warning'>You breathe through your mouth.</span>",
"<span class='warning'>You have a craving for bananas.</span>", "<span class='warning'>Your mind feels clouded.</span>")
stage5 = list("<span class='warning'>You feel like monkeying around.</span>")
/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/human/affected_mob)
if(!issmall(affected_mob))
affected_mob.monkeyize()
/datum/disease/transformation/jungle_fever/stage_act()
..()
switch(stage)
if(2)
if(prob(2))
affected_mob << "<span class='notice'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>"
if(3)
if(prob(4))
affected_mob << "<span class='danger'>You feel a stabbing pain in your head.</span>"
affected_mob.confused += 10
if(4)
if(prob(3))
affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."))
/datum/disease/transformation/robot
name = "Robotic Transformation"
cure_text = "An injection of copper."
cures = list("copper")
cure_chance = 5
agent = "R2D2 Nanomachines"
desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
severity = DANGEROUS
visibility_flags = 0
stage1 = null
stage2 = list("Your joints feel stiff.", "<span class='danger'>Beep...boop..</span>")
stage3 = list("<span class='danger'>Your joints feel very stiff.</span>", "Your skin feels loose.", "<span class='danger'>You can feel something move...inside.</span>")
stage4 = list("<span class='danger'>Your skin feels very loose.</span>", "<span class='danger'>You can feel... something...inside you.</span>")
stage5 = list("<span class='danger'>Your skin feels as if it's about to burst off!</span>")
new_form = /mob/living/silicon/robot
/datum/disease/transformation/robot/stage_act()
..()
switch(stage)
if(3)
if (prob(8))
affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
if (prob(4))
affected_mob << "<span class='danger'>You feel a stabbing pain in your head.</span>"
affected_mob.Paralyse(2)
if(4)
if (prob(20))
affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."))
/datum/disease/transformation/xeno
name = "Xenomorph Transformation"
cure_text = "Spaceacillin & Glycerol"
cures = list("spaceacillin", "glycerol")
cure_chance = 5
agent = "Rip-LEY Alien Microbes"
desc = "This disease changes the victim into a xenomorph."
severity = BIOHAZARD
visibility_flags = 0
stage1 = null
stage2 = list("Your throat feels scratchy.", "<span class='danger'>Kill...</span>")
stage3 = list("<span class='danger'>Your throat feels very scratchy.</span>", "Your skin feels tight.", "<span class='danger'>You can feel something move...inside.</span>")
stage4 = list("<span class='danger'>Your skin feels very tight.</span>", "<span class='danger'>Your blood boils!</span>", "<span class='danger'>You can feel... something...inside you.</span>")
stage5 = list("<span class='danger'>Your skin feels as if it's about to burst off!</span>")
new_form = /mob/living/carbon/alien/humanoid/hunter
/datum/disease/transformation/xeno/stage_act()
..()
switch(stage)
if(3)
if (prob(4))
affected_mob << "<span class='danger'>You feel a stabbing pain in your head.</span>"
affected_mob.Paralyse(2)
if(4)
if (prob(20))
affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"))
/datum/disease/transformation/slime
name = "Advanced Mutation Transformation"
cure_text = "frost oil"
cures = list("frostoil")
cure_chance = 80
agent = "Advanced Mutation Toxin"
desc = "This highly concentrated extract converts anything into more of itself."
severity = BIOHAZARD
visibility_flags = 0
stage1 = list("You don't feel very well.")
stage2 = list("Your skin feels a little slimy.")
stage3 = list("<span class='danger'>Your appendages are melting away.</span>", "<span class='danger'>Your limbs begin to lose their shape.</span>")
stage4 = list("<span class='danger'>You are turning into a slime.</span>")
stage5 = list("<span class='danger'>You have become a slime.</span>")
new_form = /mob/living/simple_animal/slime
/datum/disease/transformation/slime/stage_act()
..()
switch(stage)
if(1)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
if(H.species.name == "Slime People")
stage = 5
if(3)
if(ishuman(affected_mob))
var/mob/living/carbon/human/human = affected_mob
if(human.species.name != "Slime People")
human.set_species("Slime People")
/datum/disease/transformation/corgi
name = "The Barkening"
cure_text = "Death"
cures = list("adminordrazine")
agent = "Fell Doge Majicks"
desc = "This disease transforms the victim into a corgi."
visibility_flags = 0
stage1 = list("BARK.")
stage2 = list("You feel the need to wear silly hats.")
stage3 = list("<span class='danger'>Must... eat... chocolate....</span>", "<span class='danger'>YAP</span>")
stage4 = list("<span class='danger'>Visions of washing machines assail your mind!</span>")
stage5 = list("<span class='danger'>AUUUUUU!!!</span>")
new_form = /mob/living/simple_animal/pet/corgi
/datum/disease/transformation/corgi/stage_act()
..()
switch(stage)
if(3)
if (prob(8))
affected_mob.say(pick("YAP", "Woof!"))
if(4)
if (prob(20))
affected_mob.say(pick("Bark!", "AUUUUUU"))
/datum/disease/transformation/morph
name = "Gluttony's Blessing"
cure_text = "nothing"
cures = list("adminordrazine")
agent = "Gluttony's Blessing"
desc = "A 'gift' from somewhere terrible."
stage_prob = 20
severity = BIOHAZARD
visibility_flags = 0
stage1 = list("Your stomach rumbles.")
stage2 = list("Your skin feels saggy.")
stage3 = list("<span class='danger'>Your appendages are melting away.</span>", "<span class='danger'>Your limbs begin to lose their shape.</span>")
stage4 = list("<span class='danger'>You're ravenous.</span>")
stage5 = list("<span class='danger'>You have become a morph.</span>")
new_form = /mob/living/simple_animal/hostile/morph
+58
View File
@@ -0,0 +1,58 @@
/datum/disease/tuberculosis
name = "Fungal tuberculosis"
max_stages = 5
spread_text = "Airborne"
cure_text = "Spaceacillin & salbutamol"
cures = list("spaceacillin", "salbutamol")
agent = "Fungal Tubercle bacillus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 5//like hell are you getting out of hell
desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
required_organs = list(/obj/item/organ/external/head)
severity = DANGEROUS
/datum/disease/tuberculosis/stage_act() //it begins
..()
switch(stage)
if(2)
if(prob(2))
affected_mob.emote("cough")
affected_mob << "<span class='danger'>Your chest hurts.</span>"
if(prob(2))
affected_mob << "<span class='danger'>Your stomach violently rumbles!</span>"
if(prob(5))
affected_mob << "<span class='danger'>You feel a cold sweat form.</span>"
if(4)
if(prob(2))
affected_mob << "<span class='userdanger'>You see four of everything</span>"
affected_mob.Dizzy(5)
if(prob(2))
affected_mob << "<span class='danger'>You feel a sharp pain from your lower chest!</span>"
affected_mob.adjustOxyLoss(5)
affected_mob.emote("gasp")
if(prob(10))
affected_mob << "<span class='danger'>You feel air escape from your lungs painfully.</span>"
affected_mob.adjustOxyLoss(25)
affected_mob.emote("gasp")
if(5)
if(prob(2))
affected_mob << "<span class='userdanger'>[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]</span>"
affected_mob.adjustStaminaLoss(70)
if(prob(10))
affected_mob.adjustStaminaLoss(100)
affected_mob.visible_message("<span class='warning'>[affected_mob] faints!</span>", "<span class='userdanger'>You surrender yourself and feel at peace...</span>")
affected_mob.AdjustSleeping(5)
if(prob(2))
affected_mob << "<span class='userdanger'>You feel your mind relax and your thoughts drift!</span>"
affected_mob.confused = min(100, affected_mob.confused + 8)
if(prob(10))
affected_mob.vomit(20)
if(prob(3))
affected_mob << "<span class='warning'><i>[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]</i></span>"
affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0)
affected_mob.nutrition = max(affected_mob.nutrition - 100, 0)
if(prob(15))
affected_mob << "<span class='danger'>[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]</span>"
affected_mob.bodytemperature += 40
return
+118
View File
@@ -0,0 +1,118 @@
/datum/disease/wizarditis
name = "Wizarditis"
max_stages = 4
spread_text = "Airborne"
cure_text = "The Manly Dorf"
cures = list("manlydorf")
cure_chance = 100
agent = "Rincewindus Vulgaris"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 0.75
desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
severity = HARMFUL
required_organs = list(/obj/item/organ/external/head)
/*
BIRUZ BENNAR
SCYAR NILA - teleport
NEC CANTIO - dis techno
EI NATH - shocking grasp
AULIE OXIN FIERA - knock
TARCOL MINTI ZHERI - forcewall
STI KALY - blind
*/
/datum/disease/wizarditis/stage_act()
..()
switch(stage)
if(2)
if(prob(1)&&prob(50))
affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"))
if(prob(1)&&prob(50))
affected_mob << "<span class='danger'>You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].</span>"
if(3)
if(prob(1)&&prob(50))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"))
if(prob(1)&&prob(50))
affected_mob << "<span class='danger'>You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].</span>"
if(4)
if(prob(1))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"))
return
if(prob(1)&&prob(50))
affected_mob << "<span class='danger'>You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].</span>"
spawn_wizard_clothes(50)
if(prob(1)&&prob(1))
teleport()
return
/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0)
if(istype(affected_mob, /mob/living/carbon/human))
var/mob/living/carbon/human/H = affected_mob
if(prob(chance))
if(!istype(H.head, /obj/item/clothing/head/wizard))
if(!H.unEquip(H.head))
qdel(H.head)
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), slot_head)
return
if(prob(chance))
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
if(!H.unEquip(H.wear_suit))
qdel(H.wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), slot_wear_suit)
return
if(prob(chance))
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
if(!H.unEquip(H.shoes))
qdel(H.shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
return
else
var/mob/living/carbon/H = affected_mob
if(prob(chance))
if(!istype(H.r_hand, /obj/item/weapon/twohanded/staff))
H.drop_r_hand()
H.put_in_r_hand( new /obj/item/weapon/twohanded/staff(H) )
return
return
/datum/disease/wizarditis/proc/teleport()
var/list/theareas = get_areas_in_range(80, affected_mob)
for(var/area/space/S in theareas)
theareas -= S
if(!theareas||!theareas.len)
return
var/area/thearea = pick(theareas)
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea.type))
if(T.z != affected_mob.z) continue
if(T.name == "space") continue
if(!T.density)
var/clear = 1
for(var/obj/O in T)
if(O.density)
clear = 0
break
if(clear)
L+=T
if(!L)
return
affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!")
affected_mob.loc = pick(L)
return
+11 -6
View File
@@ -66,12 +66,11 @@
H.verbs += help_verb
if(make_temporary)
temporary = 1
if(H.martial_art && H.martial_art.temporary)
if(temporary)
if(temporary)
if(H.martial_art)
base = H.martial_art.base
else
H.martial_art.base = src //temporary styles have priority
return
else
base = src
H.martial_art = src
/datum/martial_art/proc/remove(var/mob/living/carbon/human/H)
@@ -379,6 +378,7 @@
/datum/martial_art/the_sleeping_carp/proc/wristWrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
A.do_attack_animation(D)
D.visible_message("<span class='warning'>[A] grabs [D]'s wrist and wrenches it sideways!</span>", \
"<span class='userdanger'>[A] grabs your wrist and violently wrenches it to the side!</span>")
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
@@ -391,6 +391,7 @@
/datum/martial_art/the_sleeping_carp/proc/backKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(A.dir == D.dir && !D.stat && !D.weakened)
A.do_attack_animation(D)
D.visible_message("<span class='warning'>[A] kicks [D] in the back!</span>", \
"<span class='userdanger'>[A] kicks you in the back, making you stumble and fall!</span>")
step_to(D,get_step(D,D.dir),1)
@@ -401,6 +402,7 @@
/datum/martial_art/the_sleeping_carp/proc/kneeStomach(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
A.do_attack_animation(D)
D.visible_message("<span class='warning'>[A] knees [D] in the stomach!</span>", \
"<span class='userdanger'>[A] winds you with a knee in the stomach!</span>")
D.audible_message("<b>[D]</b> gags!")
@@ -412,6 +414,7 @@
/datum/martial_art/the_sleeping_carp/proc/headKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
A.do_attack_animation(D)
D.visible_message("<span class='warning'>[A] kicks [D] in the head!</span>", \
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
D.apply_damage(20, BRUTE, "head")
@@ -423,6 +426,7 @@
/datum/martial_art/the_sleeping_carp/proc/elbowDrop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.weakened || D.resting || D.stat)
A.do_attack_animation(D)
D.visible_message("<span class='warning'>[A] elbow drops [D]!</span>", \
"<span class='userdanger'>[A] piledrives you with their elbow!</span>")
if(D.stat)
@@ -445,6 +449,7 @@
add_to_streak("H",D)
if(check_streak(A,D))
return 1
A.do_attack_animation(D)
var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams")
D.visible_message("<span class='danger'>[A] [atk_verb] [D]!</span>", \
"<span class='userdanger'>[A] [atk_verb] you!</span>")
@@ -631,4 +636,4 @@
if(wielded)
return 1
else
return 0
return 0
+42
View File
@@ -0,0 +1,42 @@
/datum/progressbar
var/goal = 1
var/image/bar
var/shown = 0
var/mob/user
var/client/client
/datum/progressbar/New(mob/User, goal_number, atom/target)
. = ..()
if (!istype(target))
EXCEPTION("Invalid target given")
if (goal_number)
goal = goal_number
bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0")
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
bar.pixel_y = 32
user = User
if(user)
client = user.client
/datum/progressbar/proc/update(progress)
//world << "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]"
if (!user || !user.client)
shown = 0
return
if (user.client != client)
if (client)
client.images -= bar
if (user.client)
user.client.images += bar
progress = Clamp(progress, 0, goal)
bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
if (!shown)
user.client.images += bar
shown = 1
/datum/progressbar/Destroy()
if (client)
client.images -= bar
qdel(bar)
. = ..()
+1 -1
View File
@@ -22,7 +22,7 @@
/obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr)
if(istype(user))
if(phased == 1)
if(phased)
if(user.phasein(target))
phased = 0
else
+2 -2
View File
@@ -3,7 +3,7 @@
desc = "This spell conjures objs of the specified types in range."
var/list/summon_type = list() //determines what exactly will be summoned
//should be text, like list("/obj/machinery/bot/ed209")
//should be text, like list("/mob/simple_animal/bot/ed209")
var/summon_lifespan = 0 // 0=permanent, any other time in deciseconds
var/summon_amt = 1 //amount of objects summoned
@@ -61,7 +61,7 @@
name = "Dispense Wizard Justice"
desc = "This spell dispenses wizard justice."
summon_type = list(/obj/machinery/bot/ed209)
summon_type = list(/mob/living/simple_animal/bot/ed209)
summon_amt = 10
range = 3
newVars = list("emagged" = 1,"name" = "Wizard's Justicebot")
+22 -10
View File
@@ -77,10 +77,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/emergency/evac
name = "Emergency Equipment Crate"
contains = list(/obj/machinery/bot/floorbot,
/obj/machinery/bot/floorbot,
/obj/machinery/bot/medbot,
/obj/machinery/bot/medbot,
contains = list(/mob/living/simple_animal/bot/floorbot,
/mob/living/simple_animal/bot/floorbot,
/mob/living/simple_animal/bot/medbot,
/mob/living/simple_animal/bot/medbot,
/obj/item/weapon/tank/air,
/obj/item/weapon/tank/air,
/obj/item/weapon/tank/air,
@@ -699,10 +699,20 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/medical/virus
name = "Virus Crate"
contains = list(/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random,
/obj/item/weapon/virusdish/random)
contains = list(/obj/item/weapon/reagent_containers/glass/bottle/flu_virion,
/obj/item/weapon/reagent_containers/glass/bottle/cold,
/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion,
/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion,
/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs,
/obj/item/weapon/reagent_containers/glass/bottle/magnitis,
/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat,
/obj/item/weapon/reagent_containers/glass/bottle/brainrot,
/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion,
/obj/item/weapon/reagent_containers/glass/bottle/anxiety,
/obj/item/weapon/reagent_containers/glass/bottle/beesease,
/obj/item/weapon/storage/box/syringes,
/obj/item/weapon/storage/box/beakers,
/obj/item/weapon/reagent_containers/glass/bottle/mutagen)
cost = 25
containertype = /obj/structure/closet/crate/secure/plasma
containername = "virus crate"
@@ -918,7 +928,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer)
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
/obj/item/weapon/grenade/confetti,
/obj/item/weapon/grenade/confetti)
cost = 20
containername = "party equipment"
announce_beacons = list("Bar" = list("Bar"))
@@ -1143,7 +1155,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/mule
name = "MULEbot Crate"
contains = list(/obj/machinery/bot/mulebot)
contains = list(/mob/living/simple_animal/bot/mulebot)
cost = 20
containertype = /obj/structure/largecrate/mule
containername = "\improper MULEbot crate"
+17
View File
@@ -518,6 +518,14 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons
category = "Stealthy and Inconspicuous Weapons"
/datum/uplink_item/stealthy_weapons/garrote
name = "Fiber Wire Garrote"
desc = "A length of fiber wire between two wooden handles, perfect for the discrete assassin. This weapon, when used on a target from behind \
will instantly put them in your grasp and silence them, as well as causing rapid suffocation. Does not work on those who do not need to breathe."
reference = "GAR"
item = /obj/item/weapon/twohanded/garrote
cost = 12
/datum/uplink_item/stealthy_weapons/martialarts
name = "Martial Arts Scroll"
desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat, \
@@ -856,6 +864,15 @@ var/list/uplink_items = list()
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/device_tools/assault_pod
name = "Assault Pod Targetting Device"
desc = "Use to select the landing zone of your assault pod."
item = /obj/item/device/assault_pod
reference = "APT"
cost = 30
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/device_tools/shield
name = "Energy Shield"
desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending against other attacks."
+3 -3
View File
@@ -1,6 +1,6 @@
/datum/wires/mulebot
random = 1
holder_type = /obj/machinery/bot/mulebot
holder_type = /mob/living/simple_animal/bot/mulebot
wire_count = 10
var/const/WIRE_POWER1 = 1 // power connections
@@ -14,7 +14,7 @@ var/const/WIRE_REMOTE_TX = 128 // remote trans status
var/const/WIRE_BEACON_RX = 256 // beacon ping recv
/datum/wires/mulebot/CanUse(var/mob/living/L)
var/obj/machinery/bot/mulebot/M = holder
var/mob/living/simple_animal/bot/mulebot/M = holder
if(M.open)
return 1
return 0
@@ -22,7 +22,7 @@ var/const/WIRE_BEACON_RX = 256 // beacon ping recv
// So the wires do not open a new window, handle the interaction ourselves.
/datum/wires/mulebot/Interact(var/mob/living/user)
if(CanUse(user))
var/obj/machinery/bot/mulebot/M = holder
var/mob/living/simple_animal/bot/mulebot/M = holder
M.interact(user)
/datum/wires/mulebot/UpdatePulsed(var/index)
+24 -43
View File
@@ -62,14 +62,19 @@ Actual Adjacent procs :
return b.f - a.f
//wrapper that returns an empty list if A* failed to find a path
/proc/get_path_to(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1)
var/list/path = AStar(start, end, atom, dist, maxnodes, maxnodedepth, mintargetdist, adjacent,id, exclude, simulated_only)
/proc/get_path_to(caller, end, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1)
var/list/path = AStar(caller, end, dist, maxnodes, maxnodedepth, mintargetdist, adjacent, id, exclude, simulated_only)
if(!path)
path = list()
return path
//the actual algorithm
/proc/AStar(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1)
//the actual algorithm
/proc/AStar(caller, end, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1)
//sanitation
var/start = get_turf(caller)
if(!start)
return 0
if(maxnodes)
//if start turf is farther than maxnodes from end turf, no need to do anything
@@ -81,12 +86,7 @@ Actual Adjacent procs :
var/list/closed = new() //the closed list
var/list/path = null //the returned path, if any
var/PathNode/cur //current processed turf
//sanitation
start = get_turf(start)
if(!start)
return 0
//initialization
open.Insert(new /PathNode(start,null,0,call(start,dist)(end),0))
@@ -118,9 +118,9 @@ Actual Adjacent procs :
break
//get adjacents turfs using the adjacent proc, checking for access with id
var/list/L = call(cur.source,adjacent)(atom,id, simulated_only)
var/list/L = call(cur.source,adjacent)(caller, id, simulated_only)
for(var/turf/T in L)
if(T == exclude || T in closed)
if(T == exclude || (T in closed))
continue
var/newg = cur.g + call(cur.source,dist)(T)
@@ -151,7 +151,7 @@ Actual Adjacent procs :
//Returns adjacent turfs in cardinal directions that are reachable
//simulated_only controls whether only simulated turfs are considered or not
/turf/proc/reachableAdjacentTurfs(atom, ID, simulated_only)
/turf/proc/reachableAdjacentTurfs(caller, ID, simulated_only)
var/list/L = new()
var/turf/simulated/T
@@ -159,45 +159,26 @@ Actual Adjacent procs :
T = get_step(src,dir)
if(simulated_only && !istype(T))
continue
if(!T.density && !LinkBlockedWithAccess(T, ID))
if(!T.density && !LinkBlockedWithAccess(T,caller, ID))
L.Add(T)
return L
//Returns adjacent turfs in cardinal directions that are reachable via atmos
/turf/proc/reachableAdjacentAtmosTurfs()
var/list/L = new()
var/turf/simulated/T
return atmos_adjacent_turfs
for(var/dir in cardinal)
if(dir & atmos_adjacent_turfs)
T = get_step(src,dir)
if(!istype(T))
continue
if(CanAtmosPass(T))
L.Add(T)
return L
/turf/proc/LinkBlockedWithAccess(turf/T, obj/item/weapon/card/id/ID)
/turf/proc/LinkBlockedWithAccess(turf/T, caller, ID)
var/adir = get_dir(src, T)
var/rdir = get_dir(T, src)
if(DirBlockedWithAccess(src, adir, ID))
return 1
if(DirBlockedWithAccess(T, rdir, ID))
return 1
for(var/obj/O in T)
if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER))
return 1
return 0
/proc/DirBlockedWithAccess(turf/T, dir, ID)
for(var/obj/structure/window/D in T)
if(!D.density)
continue
if(D.dir == SOUTHWEST)
for(var/obj/structure/window/W in src)
if(!W.CanAStarPass(ID, adir))
return 1
if(D.dir == dir)
for(var/obj/machinery/door/window/W in src)
if(!W.CanAStarPass(ID, adir))
return 1
for(var/obj/machinery/door/D in T)
if(!D.CanAStarPass(ID, dir))
for(var/obj/O in T)
if(!O.CanAStarPass(ID, rdir, caller))
return 1
return 0
return 0
+14 -7
View File
@@ -56,19 +56,19 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/air_doors_activated = 0
var/tele_proof = 0
var/no_teleportlocs = 0
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list()
/hook/startup/proc/process_teleport_locs()
for(var/area/AR in world)
if(AR.no_teleportlocs) continue
if(teleportlocs.Find(AR.name)) continue
var/list/turfs = get_area_turfs(AR.type)
if(turfs.len)
var/turf/picked = pick(turfs)
if ((picked.z in config.station_levels))
teleportlocs += AR.name
teleportlocs[AR.name] = AR
var/turf/picked = safepick(get_area_turfs(AR.type))
if (picked && (picked.z == ZLEVEL_STATION))
teleportlocs += AR.name
teleportlocs[AR.name] = AR
teleportlocs = sortAssoc(teleportlocs)
@@ -145,6 +145,7 @@ var/list/ghostteleportlocs = list()
//All shuttles show now be under shuttle since we have smooth-wall code.
/area/shuttle
no_teleportlocs = 1
requires_power = 0
/area/shuttle/arrival
@@ -302,6 +303,10 @@ var/list/ghostteleportlocs = list()
name = "\improper Syndicate Elite Shuttle"
icon_state = "shuttlered2"
/area/shuttle/assault_pod
name = "Steel Rain"
icon_state = "shuttle"
/area/shuttle/administration
name = "\improper Administration Shuttle"
icon_state = "shuttlered"
@@ -622,6 +627,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Ninja Area Parent"
icon_state = "ninjabase"
requires_power = 0
no_teleportlocs = 1
/area/ninja/outpost
name = "\improper SpiderClan Outpost"
@@ -634,6 +640,7 @@ var/list/ghostteleportlocs = list()
icon_state = "yellow"
requires_power = 0
lighting_use_dynamic = 0
no_teleportlocs = 1
/area/vox_station/transit
name = "\improper Hyperspace"
@@ -1782,7 +1789,7 @@ area/security/podbay
/area/toxins/xenobiology
name = "\improper Xenobiology Lab"
icon_state = "toxlab"
icon_state = "toxmix"
/area/toxins/xenobiology/xenoflora_storage
name = "\improper Xenoflora Storage"
+1 -1
View File
@@ -60,7 +60,7 @@ var/global/max_secret_rooms = 6
if("organharvest")
walltypes = list(/turf/simulated/wall/r_wall=2,/turf/simulated/wall=2,/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor,/turf/simulated/floor/engine)
treasureitems = list(/obj/machinery/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/critter/cat=2)
treasureitems = list(/mob/living/simple_animal/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/critter/cat=2)
fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/internal/appendix=2,/obj/structure/closet/crate/freezer=2,
/obj/machinery/optable=1,/obj/item/weapon/scalpel=1,/obj/item/weapon/storage/firstaid/regular=3,
/obj/item/weapon/tank/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1)
+17 -4
View File
@@ -362,6 +362,23 @@
. = 1
return 1
/atom/proc/add_blood_list(mob/living/carbon/M)
// Returns 0 if we have that blood already
if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
blood_DNA = list()
//if this blood isn't already in the list, add it
if(blood_DNA[M.dna.unique_enzymes])
return 0 //already bloodied with this blood. Cannot add more.
var/blood_type = "X*"
if(ishuman(M))
var/mob/living/carbon/human/H = M
blood_type = H.b_type
blood_DNA[M.dna.unique_enzymes] = blood_type
return 1
// Only adds blood on the floor -- Skie
/atom/proc/add_blood_floor(mob/living/carbon/M)
return //why the fuck this is at an atom level but only works on simulated turfs I don't know
/atom/proc/clean_blood()
src.germ_level = 0
@@ -377,10 +394,6 @@
if(toxvomit)
this.icon_state = "vomittox_[pick(1,4)]"
/atom/proc/add_poop_floor(mob/living/carbon/M as mob)
if( istype(src, /turf/simulated) )
new /obj/effect/decal/cleanable/poop(src)
/atom/proc/get_global_map_pos()
if(!islist(global_map) || isemptylist(global_map)) return
+18 -4
View File
@@ -108,13 +108,27 @@
..()
/atom/movable/proc/forceMove(atom/destination)
if(loc)
loc.Exited(src)
var/turf/old_loc = loc
if(old_loc)
old_loc.Exited(src)
loc = destination
if(destination)
loc.Entered(src)
for(var/atom/movable/AM in loc)
destination.Entered(src)
for(var/atom/movable/AM in destination)
AM.Crossed(src)
if(isturf(destination) && opacity)
var/turf/new_loc = destination
new_loc.reconsider_lights()
if(isturf(old_loc) && opacity)
old_loc.reconsider_lights()
for(var/datum/light_source/L in light_sources)
L.source_atom.update_light()
return 1
//called when src is thrown into hit_atom
+44 -4
View File
@@ -44,7 +44,7 @@
hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD)
/datum/atom_hud/data/diagnostic
hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD)
hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD)
/* MED/SEC/DIAG HUD HOOKS */
@@ -60,10 +60,11 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
for (var/ID in virus2)
if (ID in virusDB)
for(var/datum/disease/D in viruses)
if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT))
return 1
return 0
//helper for getting the appropriate health status
/proc/RoundHealth(health)
switch(health)
@@ -253,4 +254,43 @@
var/image/holder = hud_list[DIAG_STAT_HUD]
holder.icon_state = null
if(internal_damage)
holder.icon_state = "hudwarn"
holder.icon_state = "hudwarn"
/*~~~~~~~~~
Bots!
~~~~~~~~~~*/
/mob/living/simple_animal/bot/proc/diag_hud_set_bothealth()
var/image/holder = hud_list[DIAG_HUD]
if(stat == DEAD)
holder.icon_state = "huddiagdead"
else
holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
/mob/living/simple_animal/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed
var/image/holder = hud_list[DIAG_STAT_HUD]
if(on)
holder.icon_state = "hudstat"
else if(stat) //Generally EMP causes this
holder.icon_state = "hudoffline"
else //Bot is off
holder.icon_state = "huddead2"
/mob/living/simple_animal/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation
var/image/holder = hud_list[DIAG_BOT_HUD]
if(client) //If the bot is player controlled, it will not be following mode logic!
holder.icon_state = "hudsentient"
return
switch(mode)
if(BOT_SUMMON, BOT_RESPONDING) //Responding to PDA or AI summons
holder.icon_state = "hudcalled"
if(BOT_CLEANING, BOT_REPAIRING, BOT_HEALING) //Cleanbot cleaning, Floorbot fixing, or Medibot Healing
holder.icon_state = "hudworking"
if(BOT_PATROL, BOT_START_PATROL) //Patrol mode
holder.icon_state = "hudpatrol"
if(BOT_PREP_ARREST, BOT_ARREST, BOT_HUNT, BOT_BLOCKED, BOT_NO_ROUTE) //STOP RIGHT THERE, CRIMINAL SCUM!
holder.icon_state = "hudalert"
if(BOT_MOVING, BOT_DELIVER, BOT_GO_HOME, BOT_NAV, BOT_WAIT_FOR_NAV) //Moving to target for normal bots, moving to deliver or go home for MULES.
holder.icon_state = "hudmove"
else
holder.icon_state = ""
+4 -3
View File
@@ -406,14 +406,15 @@ var/global/list/bad_blocks[0]
// Initial DNA setup. I'm kind of wondering why the hell this doesn't just call the above.
// ready_dna is (hopefully) only used on mob creation, and sets the struc_enzymes_original and SE_original only once - Bone White
/datum/dna/proc/ready_dna(mob/living/carbon/human/character)
/datum/dna/proc/ready_dna(mob/living/carbon/human/character, flatten_SE = 1)
ResetUIFrom(character)
ResetSE()
if(flatten_SE)
ResetSE()
struc_enzymes_original = struc_enzymes // sets the original struc_enzymes when ready_dna is called
SE_original = SE
SE_original = SE.Copy()
unique_enzymes = md5(character.real_name)
reg_dna[unique_enzymes] = character.real_name
-33
View File
@@ -5,7 +5,6 @@
// flags: See below, bitfield.
#define MUTCHK_FORCED 1
/proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0)
for(var/datum/dna/gene/gene in dna_genes)
if(!M || !M.dna)
return
@@ -13,38 +12,6 @@
continue
domutation(gene, M, connected, flags)
// To prevent needless copy pasting of code i put this commented out section
// into domutation so domutcheck and genemutcheck can both use it.
/*
// Sanity checks, don't skip.
if(!gene.can_activate(M,flags))
//testing("[M] - Failed to activate [gene.name] (can_activate fail).")
continue
// Current state
var/gene_active = (gene.flags & GENE_ALWAYS_ACTIVATE)
if(!gene_active)
gene_active = M.dna.GetSEState(gene.block)
// Prior state
var/gene_prior_status = (gene.type in M.active_genes)
var/changed = gene_active != gene_prior_status || (gene.flags & GENE_ALWAYS_ACTIVATE)
// If gene state has changed:
if(changed)
// Gene active (or ALWAYS ACTIVATE)
if(gene_active || (gene.flags & GENE_ALWAYS_ACTIVATE))
// testing("[gene.name] activated!")
gene.activate(M,connected,flags)
if(M)
M.active_genes |= gene.type
// If Gene is NOT active:
else
// testing("[gene.name] deactivated!")
gene.deactivate(M,connected,flags)
if(M)
M.active_genes -= gene.type
*/
// Use this to force a mut check on a single gene!
/proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0)
-2
View File
@@ -668,8 +668,6 @@
shake_camera(M, 10, 5)
if (M == usr)
continue
if(!airborne_can_reach(UT, T))
continue
M << "<span class='warning'>You are sent flying!</span>"
M.Weaken(5)
step_away(M, UT, 15)
+1 -8
View File
@@ -8,14 +8,7 @@
icon = 'icons/mob/blob.dmi'
pass_flags = PASSBLOB
faction = list("blob")
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
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 = 360
universal_speak = 1 //So mobs can understand them when a blob uses Blob Broadcast
+5
View File
@@ -35,6 +35,11 @@
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
/obj/effect/blob/CanAStarPass(ID, dir, caller)
. = 0
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSBLOB)
/obj/effect/blob/process()
Life()
@@ -23,12 +23,8 @@
user.reagents.add_reagent("potass_iodide", 10)
user.reagents.add_reagent("charcoal", 20)
if(istype(user, /mob/living/carbon))
var/mob/living/carbon/C = user
if(C.virus2.len)
for (var/ID in C.virus2)
var/datum/disease2/disease/V = C.virus2[ID]
C.antibodies |= V.antigen
for(var/datum/disease/D in user.viruses)
D.cure()
feedback_add_details("changeling_powers","AP")
return 1
@@ -43,7 +43,7 @@
return
if(!isturf(user.loc))
return
if(!AStar(user.loc, target.loc, null, /turf/proc/Distance, user.mind.changeling.sting_range, simulated_only = 0))
if(!AStar(user, target.loc, /turf/proc/Distance, user.mind.changeling.sting_range, simulated_only = 0))
return
if(target.mind && target.mind.changeling)
sting_feedback(user,target)
@@ -46,19 +46,12 @@
harm_intent_damage = 5
minbodytemp = 0
maxbodytemp = 500
min_oxy = 0
max_oxy = INFINITY
min_tox = 0
max_tox = INFINITY
min_co2 = 0
max_co2 = INFINITY
min_n2 = 0
max_n2 = INFINITY
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)
unsuitable_atmos_damage = 0
melee_damage_lower = 15
melee_damage_upper = 15
melee_damage_type = STAMINA
ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1)
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
environment_smash = 0
attacktext = "shocks"
attack_sound = 'sound/effects/EMPulse.ogg'
@@ -6,25 +6,18 @@
response_help = "passes through"
response_disarm = "flails at"
response_harm = "punches"
icon = 'icons/mob/mob.dmi'
icon_state = "stand"
icon_living = "stand"
icon_dead = "stand"
icon = 'icons/mob/guardian.dmi'
icon_state = "magicOrange"
icon_living = "magicOrange"
icon_dead = "magicOrange"
speed = 0
a_intent = I_HARM
stop_automated_movement = 1
floating = 1
attack_sound = 'sound/weapons/punch1.ogg'
minbodytemp = 0
maxbodytemp = 10000000
min_oxy = 0
max_oxy = INFINITY
min_tox = 0
max_tox = INFINITY
min_co2 = 0
max_co2 = INFINITY
min_n2 = 0
max_n2 = INFINITY
maxbodytemp = INFINITY
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)
attacktext = "punches"
maxHealth = INFINITY //The spirit itself is invincible
health = INFINITY
@@ -32,8 +25,8 @@
melee_damage_lower = 15
melee_damage_upper = 15
AIStatus = AI_OFF
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm = 1)
var/summoned = FALSE
var/animated_manifest = FALSE
var/cooldown = 0
var/damage_transfer = 1 //how much damage from each attack we transfer to the owner
var/mob/living/summoner
@@ -60,7 +53,7 @@
src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]"
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
Recall()
if(summoned && !summoner)
if(summoned && !summoner && !adminseal)
src << "<span class='danger'>You somehow lack a summoner! As a result, you dispel!</span>"
ghostize()
qdel()
@@ -80,6 +73,17 @@
summoner << "<span class='danger'><B>Your [name] died somehow!</span></B>"
summoner.death()
/mob/living/simple_animal/hostile/guardian/handle_hud_icons_health()
if(summoner)
var/resulthealth
if(iscarbon(summoner))
resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100)
else
resulthealth = round((summoner.health / summoner.maxHealth) * 100)
hud_used.guardianhealthdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#efeeef'>[resulthealth]%</font></div>"
/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
if (summoner)
@@ -118,20 +122,16 @@
return
if(!summoner) return
if(loc == summoner)
loc = get_turf(summoner)
forceMove(get_turf(summoner))
src.client.eye = loc
cooldown = world.time + 30
if(animated_manifest)
var/end_icon = icon_state
icon_state = "parasite_forming"
spawn(6)
icon_state = end_icon
/mob/living/simple_animal/hostile/guardian/proc/Recall()
if(cooldown > world.time)
return
if(!summoner) return
loc = summoner
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src))
forceMove(summoner)
buckled = null
cooldown = world.time + 30
@@ -204,8 +204,10 @@
/mob/living/simple_animal/hostile/guardian/proc/ToggleLight()
if(!luminosity)
set_light(3)
src << "<span class='notice'>You activate your light.</span>"
else
set_light(0)
src << "<span class='notice'>You deactivate your light.</span>"
//////////////////////////TYPES OF GUARDIANS
@@ -226,6 +228,7 @@
magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!"
tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random."
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies
..()
@@ -233,13 +236,29 @@
summoner.ExtinguishMob()
summoner.adjust_fire_stacks(-20)
/mob/living/simple_animal/hostile/guardian/fire/ToggleMode()
if(src.loc == summoner)
if(toggle)
src << "You switch to dispersion mode, and will teleport victims away from your master."
toggle = FALSE
else
src << "You switch to deception mode, and will turn your victims against their allies."
toggle = TRUE
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
..()
if(prob(45))
if(istype(target, /atom/movable))
var/atom/movable/M = target
if(!M.anchored && M != summoner)
do_teleport(M, M, 10)
if(..())
if(toggle)
if(ishuman(target) && !summoner)
spawn(0)
new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
else
if(prob(45))
if(istype(target, /atom/movable))
var/atom/movable/M = target
if(!M.anchored && M != summoner)
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
..()
@@ -446,7 +465,9 @@
if((Z.temperature > 270) && (Z.temperature < 360))
var/pressure = Z.return_pressure()
if((pressure > 20) && (pressure < 550))
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(A))
do_teleport(A, beacon, 0)
new /obj/effect/overlay/temp/guardian/phase(get_turf(A))
else
src << "<span class='danger'><B>The beacon isn't in a safe location!</span></B>"
else
@@ -476,7 +497,10 @@
ranged_cooldown_cap = 1
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
rapid = 1
range = 13
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit."
magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat."
tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online."
@@ -507,6 +531,14 @@
else
src << "<span class='danger'><B>You have to be recalled to toggle modes!</span></B>"
/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight()
if(see_invisible == SEE_INVISIBLE_MINIMUM)
src << "<span class='notice'>You deactivate your night vision.</span>"
see_invisible = SEE_INVISIBLE_LIVING
else
src << "<span class='notice'>You activate your night vision.</span>"
see_invisible = SEE_INVISIBLE_MINIMUM
/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare()
set name = "Set Surveillance Trap"
set category = "Guardian"
@@ -675,7 +707,6 @@
else
gaurdiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in possible_guardians
var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082")
switch(gaurdiantype)
if("Chaos")
@@ -705,29 +736,42 @@
user.verbs += /mob/living/proc/guardian_comm
user.verbs += /mob/living/proc/guardian_recall
user.verbs += /mob/living/proc/guardian_reset
var/magic_suite = pick("Wands","Cups","Swords","Pentacles")
var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
var/color
var/picked_name
var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082")
switch (theme)
if("magic")
G.name = "[mob_name] of [magic_suite]"
G.color = picked_color
G.real_name = "[mob_name] of [magic_suite]"
color = pick("Pink", "Red", "Orange", "Green", "Blue")
picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
G.name = "[picked_name] [color]"
G.real_name = "[picked_name] [color]"
G.icon_living = "[theme][color]"
G.icon_state = "[theme][color]"
G.icon_dead = "[theme][color]"
user << "[G.magic_fluff_string]."
if("tech")
var/colour = pick("orange", "neon", "pink", "red", "blue", "green")
G.name = "[picked_name] [capitalize(colour)]"
G.real_name = "[picked_name] [capitalize(colour)]"
G.icon_living = "parasite[colour]"
G.icon_state = "parasite[colour]"
G.icon_dead = "parasite[colour]"
G.animated_manifest = TRUE
color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors
picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium")
G.name = "[picked_name] [color]"
G.real_name = "[picked_name] [color]"
G.icon_living = "[theme][color]"
G.icon_state = "[theme][color]"
G.icon_dead = "[theme][color]"
user << "[G.tech_fluff_string]."
G.speak_emote = list("states")
if("bio")
G.icon = 'icons/mob/mob.dmi'
picked_name = pick("brood", "hive", "nest")
user << "[G.bio_fluff_string]."
G.name = "[mob_name] [picked_name]"
G.name = "[picked_name] swarm"
G.color = picked_color
G.real_name = "[mob_name] [picked_name]"
G.real_name = "[picked_name] swarm"
G.icon_living = "headcrab"
G.icon_state = "headcrab"
G.attacktext = "swarms"
@@ -798,17 +842,17 @@
///HUD
/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_midnight.dmi')
/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
adding = list()
var/obj/screen/using
guardianhealthdisplay = new /obj/screen/guardian()
guardianhealthdisplay.name = "summoner health"
guardianhealthdisplay.screen_loc = ui_health
guardianhealthdisplay.mouse_opacity = 0
adding += guardianhealthdisplay
using = new /obj/screen/guardian/Manifest()
using.screen_loc = ui_rhand
adding += using
@@ -834,12 +878,11 @@
mymob.client.screen += adding
//HUD BUTTONS
/obj/screen/guardian
icon = 'icons/mob/guardian.dmi'
icon_state = "base"
/obj/screen/guardian/Manifest
icon_state = "manifest"
@@ -882,6 +925,7 @@
var/mob/living/simple_animal/hostile/guardian/G = usr
G.Communicate()
/obj/screen/guardian/ToggleLight
icon_state = "light"
name = "Toggle Light"
@@ -17,14 +17,7 @@
pass_flags = PASSTABLE
ventcrawler = 2
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
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
maxHealth = 150
@@ -38,7 +31,7 @@
wander = 0
attacktext = "glomps"
attack_sound = 'sound/effects/blobattack.ogg'
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2)
var/morphed = 0
var/atom/movable/form = null
@@ -18,6 +18,7 @@
health = INFINITY //Revenants don't use health, they use essence instead
maxHealth = INFINITY
see_invisible = INVISIBILITY_REVENANT
see_in_dark = 8
universal_understand = 1
response_help = "passes through"
response_disarm = "swings at"
@@ -33,6 +34,7 @@
density = 0
flying = 1
anchored = 1
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
var/essence = 75 //The resource of revenants. Max health is equal to three times this amount
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
@@ -86,112 +88,19 @@
if(essence == 0)
src << "<span class='revendanger'>You feel your essence fraying!</span>"
/mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly.
if(client.click_intercept)
client.click_intercept.InterceptClickOn(src, params, A)
return
var/list/modifiers = params2list(params)
if(modifiers["middle"])
MiddleClickOn(A)
return
if(modifiers["shift"])
ShiftClickOn(A)
return
if(modifiers["alt"])
AltClickOn(A)
return
if(modifiers["ctrl"])
CtrlClickOn(A)
return
if(world.time <= next_move)
return
A.attack_ghost(src)
if(ishuman(A) && in_range(src, A))
Harvest(A)
/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target)
if(!castcheck(0))
return
if(draining)
src << "<span class='revenwarning'>You are already siphoning the essence of a soul!</span>"
return
if(target in drained_mobs)
src << "<span class='revenwarning'>[target]'s soul is dead and empty.</span>"
return
if(!target.stat)
src << "<span class='revennotice'>This being's soul is too strong to harvest.</span>"
if(prob(10))
target << "You feel as if you are being watched."
return
draining = 1
essence_drained = rand(15, 20)
src << "<span class='revennotice'>You search for the soul of [target].</span>"
if(do_after(src, 10, 3, 0, target = target)) //did they get deleted in that second?
if(target.ckey)
src << "<span class='revennotice'>Their soul burns with intelligence.</span>"
essence_drained += rand(20, 30)
if(target.stat != DEAD)
src << "<span class='revennotice'>Their soul blazes with life!</span>"
essence_drained += rand(40, 50)
else
src << "<span class='revennotice'>Their soul is weak and faltering.</span>"
if(do_after(src, 20, 6, 0, target = target)) //did they get deleted NOW?
switch(essence_drained)
if(1 to 30)
src << "<span class='revennotice'>[target] will not yield much essence. Still, every bit counts.</span>"
if(30 to 70)
src << "<span class='revennotice'>[target] will yield an average amount of essence.</span>"
if(70 to 90)
src << "<span class='revenboldnotice'>Such a feast! [target] will yield much essence to you.</span>"
if(90 to INFINITY)
src << "<span class='revenbignotice'>Ah, the perfect soul. [target] will yield massive amounts of essence to you.</span>"
if(do_after(src, 20, 6, 0, target = target)) //how about now
if(!target.stat)
src << "<span class='revenwarning'>They are now powerful enough to fight off your draining.</span>"
target << "<span class='boldannounce'>You feel something tugging across your body before subsiding.</span>"
draining = 0
return //hey, wait a minute...
src << "<span class='revenminor'>You begin siphoning essence from [target]'s soul.</span>"
if(target.stat != DEAD)
target << "<span class='warning'>You feel a horribly unpleasant draining sensation as your grip on life weakens...</span>"
icon_state = "revenant_draining"
reveal(27)
stun(27)
target.visible_message("<span class='warning'>[target] suddenly rises slightly into the air, their skin turning an ashy gray.</span>")
target.Beam(src,icon_state="drain_life",icon='icons/effects/effects.dmi',time=26)
if(do_after(src, 30, 9, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
change_essence_amount(essence_drained, 0, target)
if(essence_drained > 90)
essence_regen_cap += 25
perfectsouls += 1
src << "<span class='revenboldnotice'>The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].</span>"
src << "<span class='revennotice'>[target]'s soul has been considerably weakened and will yield no more essence for the time being.</span>"
target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \
"<span class='revenwarning'>Violets lights, dancing in your vision, getting clo--</span>")
drained_mobs.Add(target)
target.death(0)
else
src << "<span class='revenwarning'>[target ? "[target] has":"They have"] been drawn out of your grasp. The link has been broken.</span>"
draining = 0
essence_drained = 0
if(target) //Wait, target is WHERE NOW?
target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \
"<span class='revenwarning'>Violets lights, dancing in your vision, receding--</span>")
return
else
src << "<span class='revenwarning'>You are not close enough to siphon [target ? "[target]'s":"their"] soul. The link has been broken.</span>"
draining = 0
essence_drained = 0
return
draining = 0
essence_drained = 0
return
/mob/living/simple_animal/revenant/say(message)
return 0 //Revenants cannot speak out loud.
if(!message)
return
log_say("[key_name(src)] : [message]")
var/rendered = "<span class='revennotice'><b>[src]</b> says, \"[message]\"</span>"
for(var/mob/M in mob_list)
if(istype(M, /mob/living/simple_animal/revenant))
M << rendered
if(isobserver(M))
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [rendered]"
return
/mob/living/simple_animal/revenant/Stat()
..()
@@ -237,6 +146,7 @@
/mob/living/simple_animal/revenant/proc/giveSpells()
if(src.mind)
src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
src.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null))
src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null))
src.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
@@ -244,9 +154,16 @@
return 1
return 0
/mob/living/simple_animal/revenant/dust()
death()
/mob/living/simple_animal/revenant/gib()
death()
/mob/living/simple_animal/revenant/death()
..()
if(!revealed) //Revenants cannot die if they aren't revealed
if(!revealed || stat == DEAD) //Revenants cannot die if they aren't revealed //or are already dead
return
ghost_darkness_images -= ghostimage
updateallghostimages()
@@ -263,6 +180,8 @@
alpha = i
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
var/obj/item/weapon/ectoplasm/revenant/R = new (get_turf(src))
var/reforming_essence = essence_regen_cap //retain the gained essence capacity
R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls
R.client_to_revive = src.client //If the essence reforms, the old revenant is put back in the body
ghostize()
qdel(src)
@@ -356,7 +275,7 @@
var/targetAmount = 100
/datum/objective/revenant/New()
targetAmount = rand(200,500)
targetAmount = rand(350,600)
explanation_text = "Absorb [targetAmount] points of essence from humans."
..()
@@ -374,12 +293,17 @@
/datum/objective/revenantFluff
/datum/objective/revenantFluff/New()
var/list/explanationTexts = list("Attempt to make your presence unknown to the crew.", \
"Collaborate with existing antagonists aboard the station to gain essence.", \
"Remain nonlethal and only absorb bodies that have already died.", \
"Use your environments to eliminate isolated people.", \
"If there is a chaplain aboard the station, ensure they are killed.", \
"Hinder the crew without killing them.")
var/list/explanationTexts = list("Assist and exacerbate existing threats at critical moments.", \
"Avoid killing in plain sight.", \
"Cause as much chaos and anger as you can without being killed.", \
"Damage and render as much of the station rusted and unusable as possible.", \
"Disable and cause malfunctions in as many machines as possible.", \
"Ensure that any holy weapons are rendered unusable.", \
"Hinder the crew while attempting to avoid being noticed.", \
"Make the crew as miserable as possible.", \
"Make the clown as miserable as possible.", \
"Make the captain as miserable as possible.", \
"Prevent the use of energy weapons where possible.")
explanation_text = pick(explanationTexts)
..()
@@ -394,6 +318,7 @@
icon_state = "revenantEctoplasm"
w_class = 2
var/reforming = 1
var/essence = 75 //the maximum essence of the reforming revenant
var/inert = 0
var/client/client_to_revive
@@ -1,3 +1,117 @@
///Harvest
/mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly.
if(client.click_intercept)
client.click_intercept.InterceptClickOn(src, params, A)
return
var/list/modifiers = params2list(params)
if(modifiers["middle"])
MiddleClickOn(A)
return
if(modifiers["shift"])
ShiftClickOn(A)
return
if(modifiers["alt"])
AltClickOn(A)
return
if(modifiers["ctrl"])
CtrlClickOn(A)
return
if(world.time <= next_move)
return
A.attack_ghost(src)
if(ishuman(A) && in_range(src, A))
Harvest(A)
/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target)
if(!castcheck(0))
return
if(draining)
src << "<span class='revenwarning'>You are already siphoning the essence of a soul!</span>"
return
if(target in drained_mobs)
src << "<span class='revenwarning'>[target]'s soul is dead and empty.</span>"
return
if(!target.stat)
src << "<span class='revennotice'>This being's soul is too strong to harvest.</span>"
if(prob(10))
target << "You feel as if you are being watched."
return
draining = 1
essence_drained = rand(15, 20)
src << "<span class='revennotice'>You search for the soul of [target].</span>"
if(do_after(src, 10, 0, target = target)) //did they get deleted in that second?
if(target.ckey)
src << "<span class='revennotice'>Their soul burns with intelligence.</span>"
essence_drained += rand(20, 30)
if(target.stat != DEAD)
src << "<span class='revennotice'>Their soul blazes with life!</span>"
essence_drained += rand(40, 50)
else
src << "<span class='revennotice'>Their soul is weak and faltering.</span>"
if(do_after(src, 20, 0, target = target)) //did they get deleted NOW?
switch(essence_drained)
if(1 to 30)
src << "<span class='revennotice'>[target] will not yield much essence. Still, every bit counts.</span>"
if(30 to 70)
src << "<span class='revennotice'>[target] will yield an average amount of essence.</span>"
if(70 to 90)
src << "<span class='revenboldnotice'>Such a feast! [target] will yield much essence to you.</span>"
if(90 to INFINITY)
src << "<span class='revenbignotice'>Ah, the perfect soul. [target] will yield massive amounts of essence to you.</span>"
if(do_after(src, 20, 0, target = target)) //how about now
if(!target.stat)
src << "<span class='revenwarning'>They are now powerful enough to fight off your draining.</span>"
target << "<span class='boldannounce'>You feel something tugging across your body before subsiding.</span>"
draining = 0
return //hey, wait a minute...
src << "<span class='revenminor'>You begin siphoning essence from [target]'s soul.</span>"
if(target.stat != DEAD)
target << "<span class='warning'>You feel a horribly unpleasant draining sensation as your grip on life weakens...</span>"
icon_state = "revenant_draining"
reveal(27)
stun(27)
target.visible_message("<span class='warning'>[target] suddenly rises slightly into the air, their skin turning an ashy gray.</span>")
target.Beam(src,icon_state="drain_life",icon='icons/effects/effects.dmi',time=26)
if(do_after(src, 30, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
change_essence_amount(essence_drained, 0, target)
if(essence_drained > 90)
essence_regen_cap += 25
perfectsouls += 1
src << "<span class='revenboldnotice'>The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].</span>"
src << "<span class='revennotice'>[target]'s soul has been considerably weakened and will yield no more essence for the time being.</span>"
target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \
"<span class='revenwarning'>Violets lights, dancing in your vision, getting clo--</span>")
drained_mobs.Add(target)
target.death(0)
else
src << "<span class='revenwarning'>[target ? "[target] has":"They have"] been drawn out of your grasp. The link has been broken.</span>"
draining = 0
essence_drained = 0
if(target) //Wait, target is WHERE NOW?
target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \
"<span class='revenwarning'>Violets lights, dancing in your vision, receding--</span>")
return
else
src << "<span class='revenwarning'>You are not close enough to siphon [target ? "[target]'s":"their"] soul. The link has been broken.</span>"
draining = 0
essence_drained = 0
return
draining = 0
essence_drained = 0
return
//Toggle night vision: lets the revenant toggle its night vision
/obj/effect/proc_holder/spell/targeted/night_vision/revenant
charge_max = 0
panel = "Revenant Abilities"
message = "<span class='revennotice'>You toggle your night vision.</span>"
action_icon_state = "r_nightvision"
action_background_icon_state = "bg_revenant"
//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob
/obj/effect/proc_holder/spell/targeted/revenant_transmit
name = "Transmit"
@@ -81,7 +195,7 @@
stun = 30
cast_amount = 45
var/shock_range = 2
var/shock_damage = 18
var/shock_damage = 20
action_icon_state = "overload_lights"
/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
@@ -116,9 +230,11 @@
name = "Defile"
desc = "Twists and corrupts the nearby area as well as dispelling holy auras on floors."
charge_max = 150
range = 3
range = 4
stun = 10
reveal = 40
unlock_amount = 75
cast_amount = 40
cast_amount = 30
action_icon_state = "defile"
var/stamdamage= 25
var/toxdamage = 5
@@ -144,9 +260,19 @@
new/obj/effect/overlay/temp/revenant(T)
T.ChangeTurf(/turf/simulated/wall/r_wall/rust)
for(var/obj/structure/window/window in T.contents)
window.hit(rand(50,90))
window.hit(rand(30,80))
if(window && window.is_fulltile())
new/obj/effect/overlay/temp/revenant/cracks(window.loc)
for(var/obj/structure/closet/closet in T.contents)
closet.open()
if(!istype(T, /turf/simulated/floor/plating) && !istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(15))
var/turf/simulated/floor/floor = T
if(floor.intact)
floor.builtin_tile.loc = floor
floor.broken = 0
floor.burnt = 0
floor.make_plating(1)
for(var/obj/machinery/light/light in T.contents)
light.flicker(30) //spooky
@@ -156,6 +282,7 @@
desc = "Corrupts and damages nearby machines and mechanical objects."
charge_max = 200
range = 4
cast_amount = 45
unlock_amount = 150
action_icon_state = "malfunction"
@@ -164,18 +291,18 @@
if(attempt_cast(user))
for(var/turf/T in targets)
spawn(0)
for(var/obj/machinery/bot/bot in T.contents)
for(var/mob/living/simple_animal/bot/bot in T.contents)
if(!bot.emagged)
new/obj/effect/overlay/temp/revenant(bot.loc)
bot.locked = 0
bot.open = 1
bot.Emag(null)
bot.emag_act(null)
for(var/mob/living/carbon/human/human in T.contents)
human << "<span class='warning'>You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].</span>"
new/obj/effect/overlay/temp/revenant(human.loc)
human.emp_act(1)
for(var/obj/thing in T.contents)
if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes) || istype(thing, /obj/machinery/bot)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery
if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery
continue
if(prob(20))
if(prob(50))
@@ -42,11 +42,13 @@
var/mob/living/victim = pulling
if(victim.stat == CONSCIOUS)
visible_message("<span class='warning'>[victim] kicks free of [B] just before entering it!</span>")
stop_pulling()
else
victim.forceMove(holder)//holder
victim.emote("scream")
visible_message("<span class='warning'><b>[src] drags [victim] into [B]!</b></span>")
kidnapped = victim
stop_pulling()
flick("jaunt",animation)
loc = holder
holder = holder
@@ -94,48 +96,53 @@
flags = NODROP|ABSTRACT
/mob/living/proc/phasein(var/obj/effect/decal/cleanable/B)
if(notransform)
src << "<span class='warning'>Finish eating first!</span>"
return 0
else
var/atom/movable/overlay/animation = new /atom/movable/overlay( B.loc )
animation.name = "odd blood"
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
animation.icon_state = "jauntup" //Paradise Port:I reversed the jaunt animation so it looks like its rising up
animation.layer = 5
animation.master = B.loc
animation.dir = dir
B.visible_message("<span class='warning'>[B] starts to bubble...</span>")
if(!do_after(src, 20, target = B))
return
if(!B)
return
forceMove(B.loc)
client.eye = src
if (prob(25) && istype(src, /mob/living/simple_animal/slaughter))
var/list/voice = list('sound/hallucinations/behind_you1.ogg','sound/hallucinations/im_here1.ogg','sound/hallucinations/turn_around1.ogg','sound/hallucinations/i_see_you1.ogg')
playsound(get_turf(src), pick(voice),50, 1, -1)
visible_message("<span class='warning'><B>\The [src] rises out of \the [B]!</B>")
playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
flick("jauntup",animation)
qdel(holder)
holder = null
if(iscarbon(src))
var/mob/living/carbon/C = src
for(var/obj/item/weapon/bloodcrawl/BC in C)
C.flags = null
C.unEquip(BC)
qdel(BC)
var/oldcolor = color
color = B.color
sleep(6)//wait for animation to finish
if(animation)
qdel(animation)
spawn(30)
color = oldcolor
return 1
B.visible_message("<span class='warning'>[B] starts to bubble...</span>")
if(!do_after(src, 20, target = B))
return
if(!B)
return
forceMove(B.loc)
client.eye = src
var/atom/movable/overlay/animation = new /atom/movable/overlay( B.loc )
animation.name = "odd blood"
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
animation.icon_state = "jauntup" //Paradise Port:I reversed the jaunt animation so it looks like its rising up
animation.layer = 5
animation.master = B.loc
animation.dir = dir
if(prob(25) && istype(src, /mob/living/simple_animal/slaughter))
var/list/voice = list('sound/hallucinations/behind_you1.ogg','sound/hallucinations/im_here1.ogg','sound/hallucinations/turn_around1.ogg','sound/hallucinations/i_see_you1.ogg')
playsound(get_turf(src), pick(voice),50, 1, -1)
visible_message("<span class='warning'><B>\The [src] rises out of \the [B]!</B>")
playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
flick("jauntup",animation)
qdel(holder)
holder = null
if(iscarbon(src))
var/mob/living/carbon/C = src
for(var/obj/item/weapon/bloodcrawl/BC in C)
C.flags = null
C.unEquip(BC)
qdel(BC)
var/oldcolor = color
color = B.color
sleep(6)//wait for animation to finish
if(animation)
qdel(animation)
spawn(30)
color = oldcolor
return 1
/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
name = "odd blood"
@@ -18,14 +18,7 @@
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/misc/demon_attack1.ogg'
min_oxy = 0
max_oxy = INFINITY
min_tox = 0
max_tox = INFINITY
min_co2 = 0
max_co2 = INFINITY
min_n2 = 0
max_n2 = INFINITY
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 = INFINITY
faction = list("slaughter")
@@ -107,7 +100,7 @@
/mob/living/simple_animal/slaughter/phasein()
..()
. = ..()
speed = 0
boost = world.time + 60

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