diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 0da4f75e1bf..33d02d6e06e 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -77,4 +77,5 @@
#define ALIEN 4
#define ROBOT 8
#define SLIME 16
-#define DRONE 32
\ No newline at end of file
+#define DRONE 32
+#define SWARMER 64
\ No newline at end of file
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 2ec7b4c407f..66ae50cf852 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -342,4 +342,10 @@
for(var/datum/D in L)
if(D.vars.Find(varname))
if(D.vars[varname] == value)
- return D
\ No newline at end of file
+ return D
+
+//remove all nulls from a list
+/proc/removeNullsFromList(list/L)
+ while(L.Remove(null))
+ continue
+ return L
\ No newline at end of file
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index fb209d087e7..d947bfa6553 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -197,6 +197,8 @@ var/datum/global_hud/global_hud = new()
blob_hud()
else if(isdrone(mymob))
drone_hud(ui_style)
+ else if(isswarmer(mymob))
+ swarmer_hud()
//Version denotes which style should be displayed. blank or 0 means "next version"
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index a4639a42327..31bdbd542a8 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -103,7 +103,7 @@ calculate the longest number of ticks the MC can wait between each cycle without
var/oldwait = SS.wait
var/GlobalCostDelta = (SSCostPerSecond-(SS.cost/(SS.wait/10)))-1
var/NewWait = MC_AVERAGE(oldwait,(SS.cost-SS.dwait_buffer+GlobalCostDelta)*SS.dwait_delta)
- SS.wait = Clamp(round(NewWait,world.tick_lag),SS.dwait_lower,SS.dwait_upper)
+ SS.wait = Clamp(NewWait,SS.dwait_lower,SS.dwait_upper)
if (oldwait != SS.wait)
calculateGCD()
SS.next_fire += SS.wait
@@ -147,4 +147,4 @@ calculate the longest number of ticks the MC can wait between each cycle without
msg += "\t [varname] = [varval]\n"
world.log << msg
- subsystems = master_controller.subsystems
\ No newline at end of file
+ subsystems = master_controller.subsystems
diff --git a/code/controllers/subsystems.dm b/code/controllers/subsystems.dm
index 88e3451a4d2..5c3c9a50f72 100644
--- a/code/controllers/subsystems.dm
+++ b/code/controllers/subsystems.dm
@@ -47,7 +47,7 @@
/datum/subsystem/proc/stat_entry(msg)
var/dwait = ""
if (dynamic_wait)
- dwait = "DWait:[wait]ds "
+ dwait = "DWait:[round(wait,0.1)]ds "
stat(name, "[round(cost,0.001)]ds\t[dwait][msg]")
@@ -59,4 +59,4 @@
//usually called via datum/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash)
//should attempt to salvage what it can from the old instance of subsystem
-/datum/subsystem/proc/Recover()
\ No newline at end of file
+/datum/subsystem/proc/Recover()
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 440967945ab..cad8505781d 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -39,6 +39,7 @@
var/obj/effect/blob/factory/factory = null
var/list/human_overlays = list()
var/is_zombie = 0
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
@@ -161,7 +162,7 @@
force_threshold = 10
environment_smash = 3
mob_size = MOB_SIZE_LARGE
-
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
return
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 243c5c8724f..5cd021fff74 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -65,7 +65,7 @@
chemical_cost = 40
dna_cost = 3
genetic_damage = 100
- var/datum/dna/selected_dna = null
+ var/datum/changelingprofile/selected_dna = null
/obj/effect/proc_holder/changeling/sting/transformation/Click()
var/mob/user = usr
@@ -87,8 +87,8 @@
return 1
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target)
- add_logs(user, target, "stung", "transformation sting", " new identity is [selected_dna.real_name]")
- var/datum/dna/NewDNA = selected_dna
+ add_logs(user, target, "stung", "transformation sting", " new identity is [selected_dna.dna.real_name]")
+ var/datum/dna/NewDNA = selected_dna.dna
if(ismonkey(target))
user << "Our genes cry out as we sting [target.name]!"
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 9c6639c3bd7..c7d00e16013 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -70,17 +70,16 @@
#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_LOADING 12 // loading/unloading
- #define BOT_DELIVER 13 // moving to deliver
- #define BOT_GO_HOME 14 // returning to home
- #define BOT_BLOCKED 15 // blocked
- #define BOT_NAV 16 // computing navigation
- #define BOT_WAIT_FOR_NAV 17 // waiting for nav computation
- #define BOT_NO_ROUTE 18 // no destination beacon found (or no route)
+ #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)
var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \
"Beginning Patrol", "Patrolling", "Summoned by PDA", \
"Cleaning", "Repairing", "Proceeding to work site", "Healing", \
- "Proceeding to AI waypoint", "Loading/Unloading", "Navigating to Delivery Location", "Navigating to Home", \
+ "Proceeding to AI waypoint", "Navigating to Delivery Location", "Navigating to Home", \
"Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination")
//This holds text for what the bot is mode doing, reported on the remote bot control interface.
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 68643c28cb6..8f69d506dc5 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -6,6 +6,11 @@
var/global/mulebot_count = 0
+
+#define SIGH 0
+#define ANNOYED 1
+#define DELIGHT 2
+
/obj/machinery/bot/mulebot
name = "\improper MULEbot"
desc = "A Multiple Utility Load Effector bot."
@@ -22,13 +27,15 @@ var/global/mulebot_count = 0
bot_type = MULE_BOT
model = "MULE"
blood_DNA = list()
+ can_buckle = 1
+ buckle_lying = 0
suffix = ""
var/turf/target // this is turf to navigate to (location of beacon)
var/loaddir = 0 // this the direction to unload onto/load from
var/home_destination = "" // tag of home beacon
- req_access = list(access_cargo)
+ req_access = list(access_cargo)
mode = BOT_IDLE
@@ -77,6 +84,26 @@ obj/machinery/bot/mulebot/bot_reset()
reached_target = 0
+obj/machinery/bot/mulebot/Move(atom/newloc, direct)
+ . = ..()
+ if(buckled_mob)
+ if(!buckled_mob.Move(loc, direct))
+ loc = buckled_mob.loc //we gotta go back
+ last_move = buckled_mob.last_move
+ inertia_dir = last_move
+ buckled_mob.inertia_dir = last_move
+ . = 0
+
+obj/machinery/bot/mulebot/Process_Spacemove(movement_dir = 0)
+ if(buckled_mob)
+ return buckled_mob.Process_Spacemove(movement_dir)
+ return ..()
+
+obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5)
+ if(mover == buckled_mob)
+ return 1
+ return ..()
+
// attack by item
// emag : lock/unlock,
// screwdriver: open/close hatch
@@ -183,8 +210,6 @@ obj/machinery/bot/mulebot/bot_reset()
switch(mode)
if(BOT_IDLE)
dat += "Ready"
- if(BOT_LOADING)
- dat += "[mode_name[BOT_LOADING]]"
if(BOT_DELIVER)
dat += "[mode_name[BOT_DELIVER]]"
if(BOT_GO_HOME)
@@ -358,7 +383,7 @@ obj/machinery/bot/mulebot/bot_reset()
updateDialog()
if("unload")
- if(load && mode !=1)
+ if(load && mode != BOT_HUNT)
if(loc == target)
unload(loaddir)
else
@@ -379,7 +404,6 @@ obj/machinery/bot/mulebot/bot_reset()
-
// returns true if the bot has power
/obj/machinery/bot/mulebot/proc/has_power()
return !open && cell && cell.charge > 0 && wires.HasPower()
@@ -393,66 +417,94 @@ obj/machinery/bot/mulebot/bot_reset()
user << "Access denied."
return 0
+/obj/machinery/bot/mulebot/proc/buzz(type)
+ switch(type)
+ if(SIGH)
+ visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
+ playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ if(ANNOYED)
+ visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.")
+ playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ if(DELIGHT)
+ visible_message("[src] makes a delighted ping!", "You hear a ping.")
+ playsound(loc, 'sound/machines/ping.ogg', 50, 0)
+
+
// mousedrop a crate to load the bot
// can load anything if emagged
+/obj/machinery/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user)
-/obj/machinery/bot/mulebot/MouseDrop_T(atom/movable/C, mob/user)
-
- if(user.stat)
+ if(user.incapacitated() || user.lying)
return
- if (!on || !istype(C)|| C.anchored || get_dist(user, src) > 1 || get_dist(src,C) > 1 )
+ if (!istype(AM))
return
- if(load)
- return
-
- load(C)
-
+ load(AM)
// called to load a crate
-/obj/machinery/bot/mulebot/proc/load(atom/movable/C)
- if(wires.LoadCheck() && !istype(C,/obj/structure/closet/crate))
- visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
- playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
- return // if not emagged, only allow crates to be loaded
-
- //I'm sure someone will come along and ask why this is here... well people were dragging screen items onto the mule, and that was not cool.
- //So this is a simple fix that only allows a selection of item types to be considered. Further narrowing-down is below.
- if(!istype(C,/obj/item) && !istype(C,/obj/machinery) && !istype(C,/obj/structure) && !ismob(C))
- return
- if(!isturf(C.loc)) //To prevent the loading from stuff from someone's inventory, which wouldn't get handled properly.
+/obj/machinery/bot/mulebot/proc/load(atom/movable/AM)
+ if(load || AM.anchored)
return
- if(get_dist(C, src) > 1 || load || !on)
+ if(!isturf(AM.loc)) //To prevent the loading from stuff from someone's inventory or screen icons.
return
- mode = BOT_LOADING
- // if a create, close before loading
- var/obj/structure/closet/crate/crate = C
- if(istype(crate))
- crate.close()
+ var/obj/structure/closet/crate/CRATE
+ if(istype(AM,/obj/structure/closet/crate))
+ CRATE = AM
+ else
+ if(wires.LoadCheck())
+ buzz(SIGH)
+ return // if not emagged, only allow crates to be loaded
- C.loc = loc
- sleep(2)
- if(C.loc != loc) //To prevent you from going onto more thano ne bot.
- return
- C.loc = src
- load = C
+ if(CRATE) // if it's a crate, close before loading
+ CRATE.close()
- C.pixel_y += 9
- if(C.layer < layer)
- C.layer = layer + 0.1
- overlays += C
+ if(isobj(AM))
+ var/obj/O = AM
+ if(O.buckled_mob || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it.
+ buzz(SIGH)
+ return
- if(ismob(C))
- var/mob/M = C
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
+ if(isliving(AM))
+ if(!buckle_mob(AM))
+ return
+ else
+ AM.loc = src
+ AM.pixel_y += 9
+ if(AM.layer < layer)
+ AM.layer = layer + 0.1
+ overlays += AM
+ load= AM
mode = BOT_IDLE
+/obj/machinery/bot/mulebot/buckle_mob(mob/living/M)
+ if(M.buckled)
+ return 0
+ var/turf/T = get_turf(src)
+ if(M.loc != T)
+ density = 0
+ var/can_step = step_towards(M, T)
+ density = 1
+ if(!can_step)
+ return 0
+ return ..()
+
+
+/obj/machinery/bot/mulebot/post_buckle_mob(mob/living/M)
+ if(M == buckled_mob) //post buckling
+ M.pixel_y = initial(M.pixel_y) + 9
+ if(M.layer < layer)
+ M.layer = layer + 0.1
+
+ else //post unbuckling
+ load = null
+ M.layer = initial(M.layer)
+ M.pixel_y = initial(M.pixel_y)
+
+
// called to unload the bot
// argument is optional direction to unload
// if zero, unload at bot's location
@@ -460,18 +512,16 @@ obj/machinery/bot/mulebot/bot_reset()
if(!load)
return
- mode = BOT_LOADING
+ mode = BOT_IDLE
+
overlays.Cut()
- if(ismob(load))
- var/mob/M = load
- if(M.client)
- M.client.perspective = MOB_PERSPECTIVE
- M.client.eye = src
-
+ if(buckled_mob)
+ unbuckle_mob()
+ return
load.loc = loc
- load.pixel_y -= 9
+ load.pixel_y = initial(load.pixel_y)
load.layer = initial(load.layer)
if(dirn)
var/turf/T = loc
@@ -481,22 +531,7 @@ obj/machinery/bot/mulebot/bot_reset()
load = null
- // in case non-load items end up in contents, dump every else too
- // this seems to happen sometimes due to race conditions
- // with items dropping as mobs are loaded
- for(var/atom/movable/AM in src)
- if(AM == cell || istype(AM , botcard) || AM == Radio) continue
-
- AM.loc = loc
- AM.layer = initial(AM.layer)
- AM.pixel_y = initial(AM.pixel_y)
- if(ismob(AM))
- var/mob/M = AM
- if(M.client)
- M.client.perspective = MOB_PERSPECTIVE
- M.client.eye = src
- mode = BOT_IDLE
/obj/machinery/bot/mulebot/call_bot()
..()
@@ -536,14 +571,14 @@ obj/machinery/bot/mulebot/bot_reset()
if(refresh) updateDialog()
/obj/machinery/bot/mulebot/proc/process_bot()
- //if(mode) world << "Mode: [mode]"
+
+ if(!on)
+ return
switch(mode)
if(BOT_IDLE) // idle
icon_state = "mulebot0"
return
- if(BOT_LOADING) // loading/unloading
- return
if(BOT_DELIVER,BOT_GO_HOME,BOT_BLOCKED) // navigating to deliver,home, or blocked
if(loc == target) // reached target
@@ -603,26 +638,22 @@ obj/machinery/bot/mulebot/bot_reset()
blockcount++
mode = BOT_BLOCKED
if(blockcount == 3)
- visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.")
- playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ buzz(ANNOYED)
if(blockcount > 10) // attempt 10 times before recomputing
// find new path excluding blocked turf
- visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
- playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ buzz(SIGH)
spawn(2)
calc_path(next)
if(path.len > 0)
- visible_message("[src] makes a delighted ping!", "You hear a ping.")
- playsound(loc, 'sound/machines/ping.ogg', 50, 0)
+ buzz(DELIGHT)
mode = BOT_BLOCKED
mode = BOT_WAIT_FOR_NAV
return
return
else
- visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.")
- playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ buzz(ANNOYED)
//world << "Bad turf."
mode = BOT_NAV
return
@@ -641,20 +672,12 @@ obj/machinery/bot/mulebot/bot_reset()
if(path.len > 0)
blockcount = 0
mode = BOT_BLOCKED
- visible_message("[src] makes a delighted ping!", "You hear a ping.")
- playsound(loc, 'sound/machines/ping.ogg', 50, 0)
+ buzz(DELIGHT)
else
- visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
- playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ buzz(SIGH)
mode = BOT_NO_ROUTE
- //if(6)
- //world << "Pending path calc."
- //if(7)
- //world << "No dest / no route."
-
- return
// calculates a path to the current destination
@@ -673,6 +696,8 @@ obj/machinery/bot/mulebot/bot_reset()
// starts bot moving to current destination
/obj/machinery/bot/mulebot/proc/start()
+ if(!on)
+ return
if(destination == home_destination)
mode = BOT_GO_HOME
else
@@ -683,6 +708,8 @@ obj/machinery/bot/mulebot/bot_reset()
// starts bot moving to home
// sends a beacon query to find
/obj/machinery/bot/mulebot/proc/start_home()
+ if(!on)
+ return
spawn(0)
set_destination(home_destination)
mode = BOT_BLOCKED
@@ -719,7 +746,7 @@ obj/machinery/bot/mulebot/bot_reset()
break
else // otherwise, look for crates only
AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir)
- if(AM)
+ if(AM && AM.Adjacent(src))
load(AM)
if(report_delivery)
speak("Now loading [load] at [get_area(src)].", radio_frequency)
@@ -774,11 +801,10 @@ obj/machinery/bot/mulebot/bot_reset()
// player on mulebot attempted to move
/obj/machinery/bot/mulebot/relaymove(mob/user)
- if(user.stat)
+ if(user.incapacitated())
return
if(load == user)
unload(0)
- return
//Update navigation data. Called when commanded to deliver, return home, or a route update is needed...
@@ -828,5 +854,12 @@ obj/machinery/bot/mulebot/bot_reset()
s.start()
new /obj/effect/decal/cleanable/oil(loc)
- unload(0)
qdel(src)
+
+/obj/machinery/bot/mulebot/Destroy()
+ unload(0)
+ return ..()
+
+#undef SIGH
+#undef ANNOYED
+#undef DELIGHT
\ No newline at end of file
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 2ea4b0b285e..460adf2b0d8 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -93,7 +93,9 @@
else if(istype(A, /mob/living)) // You Shall Not Pass!
var/mob/living/M = A
- if(!M.lying && !ismonkey(M) && !isslime(M)) //If your not laying down, or a small creature, no pass.
+ if(M.buckled && istype(M.buckled, /obj/machinery/bot/mulebot)) // mulebot passenger gets a free pass.
+ return 1
+ if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
return 0
return ..()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 82a66b848e1..fbf9c5b26f3 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -235,10 +235,8 @@
return
var/mob/living/simple_animal/M = user
M.do_attack_animation(src)
- if(M.melee_damage_upper <= 0)
- return
- attack_generic(M, M.melee_damage_upper)
-
+ if(M.melee_damage_upper > 0 && (M.melee_damage_type == BRUTE || M.melee_damage_type == BURN))
+ attack_generic(M, M.melee_damage_upper)
/obj/machinery/door/window/attack_slime(mob/living/simple_animal/slime/user)
user.do_attack_animation(src)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 4952544aeb7..a4cdf6f6470 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -230,6 +230,8 @@ Class Procs:
return
/mob/living/canUseTopic(atom/movable/M, be_close = 0, no_dextery = 0)
+ if(incapacitated())
+ return
if(no_dextery)
if(be_close && in_range(M, src))
return 1
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index f0a2c610a61..499198a49e3 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -311,7 +311,7 @@
/obj/machinery/porta_turret/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
- if(M.melee_damage_upper == 0)
+ if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
return
if(!(stat & BROKEN))
visible_message("[M] [M.attacktext] [src]!")
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 0c781f27f9b..e47bcec43c6 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -72,7 +72,7 @@
//Wrapper procs that handle sanity and user feedback
/obj/proc/user_buckle_mob(mob/living/M, mob/user)
- if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat)
+ if(!user.Adjacent(M) || user.lying || user.incapacitated())
return
add_fingerprint(user)
@@ -88,7 +88,7 @@
M.visible_message(\
"[M.name] is buckled to [src] by [user.name]!",\
"You are buckled to [src] by [user.name]!",\
- "You heat metal clanking.")
+ "You hear metal clanking.")
/obj/proc/user_unbuckle_mob(mob/user)
var/mob/living/M = unbuckle_mob()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 7cdfe31e8fb..f4de3e85772 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -14,7 +14,7 @@
var/stop_bleeding = 0
var/self_delay = 50
-/obj/item/stack/medical/attack(mob/living/carbon/M, mob/user)
+/obj/item/stack/medical/attack(mob/living/M, mob/user)
if(M.stat == 2)
var/t_him = "it"
@@ -25,8 +25,8 @@
user << "\The [M] is dead, you cannot help [t_him]!"
return
- if(!istype(M))
- user << "You don't know how to apply \the [src] to [M]..."
+ if(!istype(M, /mob/living/carbon) && !istype(M, /mob/living/simple_animal))
+ user << "You don't know how to apply \the [src] to [M]!"
return 1
if(!user.IsAdvancedToolUser())
@@ -48,7 +48,18 @@
return
if(user)
- if(M != user)
+ if (M != user)
+ if (istype(M, /mob/living/simple_animal))
+ var/mob/living/simple_animal/critter = M
+ if (!(critter.healable))
+ user << " You cannot use [src] on [M]!"
+ return
+ else if (critter.health == critter.maxHealth)
+ user << " [M] is at full health."
+ return
+ else if(src.heal_brute < 1)
+ user << " [src] won't help [M] at all."
+ return
user.visible_message("[user] applies [src] on [M].", "You apply [src] on [M].")
else
var/t_himself = "itself"
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index c12fa7dc3a2..241ddea4362 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -297,7 +297,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(!H.gloves)
+ if(!H.gloves && !(PIERCEIMMUNE in H.dna.species.specflags)) // golems, etc
H << "[src] cuts into your hand!"
var/organ = (H.hand ? "l_" : "r_") + "arm"
var/obj/item/organ/limb/affecting = H.get_organ(organ)
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 60b08e58e64..2b4f54b5679 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -25,9 +25,6 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A)
if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1))
A.clean_blood()
A.thermite = 0
- var/turf/simulated/floor/F = A
- if(istype(F))
- F.dirt = 0
for(var/obj/effect/O in A)
if(is_cleanable(O))
qdel(O)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index f1347bcd07e..65e2b67e0b3 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -45,8 +45,8 @@
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
- new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
- new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
+ new /obj/item/weapon/reagent_containers/pill/oxandrolone(src)
+ new /obj/item/weapon/reagent_containers/pill/oxandrolone(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
new /obj/item/device/healthanalyzer(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index bb209cb9515..8fa1375a480 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -166,6 +166,7 @@
/obj/structure/closet/ex_act(severity, target)
contents_explosion(severity, target)
+ new /obj/item/stack/sheet/metal(loc)
dump_contents()
qdel(src)
..()
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 355938166f5..e8775daf133 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -239,7 +239,7 @@
qdel(src)
return
if(3.0)
- if (prob(15))
+ if (prob(40))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
qdel(src)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 488932acaa4..d6c56c34a34 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -79,7 +79,8 @@
/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
- if(M.melee_damage_upper == 0) return
+ if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
+ return
M.do_attack_animation(src)
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
M.visible_message("[M] smashes against [src].", \
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 7246ac3dbbd..3ac8658347c 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -181,9 +181,6 @@
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
- if (istype(tile, /turf/simulated/floor))
- var/turf/simulated/floor/F = tile
- F.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index 696ed292eb9..b7862562752 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -11,11 +11,13 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if (prob(70))
+ new /obj/item/stack/sheet/metal(loc)
qdel(src)
return
if(3.0)
- if (prob(5))
+ if (prob(50))
+ new /obj/item/stack/sheet/metal(loc)
qdel(src)
return
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 6c02cd7e7d0..9dc8d6631e9 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -168,7 +168,7 @@
var/mob/living/simple_animal/M = user
M.do_attack_animation(src)
- if(M.melee_damage_upper <= 0)
+ if(M.melee_damage_upper <= 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
return
attack_generic(M, M.melee_damage_upper)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 9bd230386c0..6b23686fbca 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -32,8 +32,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles
var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
var/list/burnt_states = list()
- var/dirt = 0
- var/ignoredirt = 0
/turf/simulated/floor/New()
..()
@@ -167,22 +165,5 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(prob(20))
ChangeTurf(/turf/simulated/floor/plasteel/cult)
-/turf/simulated/floor/Entered(atom/A, atom/OL)
- ..()
- if(!ignoredirt)
- if(has_gravity(src))
- if(istype(A,/mob/living/carbon))
- var/mob/living/carbon/M = A
- if(M.lying) return
- if(prob(80))
- dirt++
- var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
- if(dirt >= 100)
- if(!dirtoverlay)
- dirtoverlay = new/obj/effect/decal/cleanable/dirt(src)
- dirtoverlay.alpha = 10
- else if(dirt > 100)
- dirtoverlay.alpha = min(dirtoverlay.alpha+10, 200)
-
/turf/simulated/floor/can_have_cabling()
return !burnt & !broken & !lava
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 3e3a1f61358..05a0c9d9c51 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -26,7 +26,6 @@
icon_state = "grass"
floor_tile = /obj/item/stack/tile/grass
broken_states = list("sand")
- ignoredirt = 1
/turf/simulated/floor/grass/New()
..()
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index c7a21ef6f92..067ebe88eed 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -21,7 +21,6 @@
/turf/simulated/floor/plating/beach
name = "Beach"
icon = 'icons/misc/beach.dmi'
- ignoredirt = 1
/turf/simulated/floor/plating/beach/ex_act(severity, target)
contents_explosion(severity, target)
@@ -43,13 +42,11 @@
..()
name = "Iron Sand"
icon_state = "ironsand[rand(1,15)]"
- ignoredirt = 1
/turf/simulated/floor/plating/snow
name = "snow"
icon = 'icons/turf/snow.dmi'
icon_state = "snow"
- ignoredirt = 1
/turf/simulated/floor/plating/snow/ex_act(severity, target)
contents_explosion(severity, target)
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index 51b551565c5..555e25b09be 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -11,8 +11,36 @@
icon_state = icon_regular_floor
+
/turf/simulated/floor/plasteel/black
icon_state = "dark"
+/turf/simulated/floor/plasteel/black/side
+ icon_state = "black" //NOTICE ME SEMPAI: floors.dmi contains two sprites named black, remove the incorrect one
+/turf/simulated/floor/plasteel/black/corner
+ icon_state = "blackcorner"
+
+
+/turf/simulated/floor/plasteel/white
+ icon_state = "white"
+/turf/simulated/floor/plasteel/white/side
+ icon_state = "whitehall"
+/turf/simulated/floor/plasteel/white/corner
+ icon_state = "whitecorner"
+
+
+
+/turf/simulated/floor/plasteel/brown
+ icon_state = "brown"
+/turf/simulated/floor/plasteel/brown/corner
+ icon_state = "browncorner"
+
+/turf/simulated/floor/plasteel/darkbrown
+ icon_state = "darkbrownfull"
+/turf/simulated/floor/plasteel/darkbrown/side
+ icon_state = "darkbrown"
+/turf/simulated/floor/plasteel/darkbrown/corner
+ icon_state = "darkbrowncorners"
+
/turf/simulated/floor/plasteel/green
@@ -22,7 +50,6 @@
/turf/simulated/floor/plasteel/green/corner
icon_state = "greencorner"
-
/turf/simulated/floor/plasteel/darkgreen
icon_state = "darkgreenfull"
/turf/simulated/floor/plasteel/darkgreen/side
@@ -30,11 +57,13 @@
/turf/simulated/floor/plasteel/darkgreen/corner
icon_state = "darkgreencorners"
+/turf/simulated/floor/plasteel/whitegreen
+ icon_state = "whitegreenfull"
+/turf/simulated/floor/plasteel/whitegreen/side
+ icon_state = "whitegreen"
+/turf/simulated/floor/plasteel/whitegreen/corner
+ icon_state = "whitegreencorner"
-/turf/simulated/floor/plasteel/brown
- icon_state = "brown"
-/turf/simulated/floor/plasteel/brown/corner
- icon_state = "browncorner"
/turf/simulated/floor/plasteel/red
@@ -44,7 +73,6 @@
/turf/simulated/floor/plasteel/red/corner
icon_state = "redcorner"
-
/turf/simulated/floor/plasteel/darkred
icon_state = "darkredfull"
/turf/simulated/floor/plasteel/darkred/side
@@ -52,6 +80,90 @@
/turf/simulated/floor/plasteel/darkred/corner
icon_state = "darkredcorners"
+/turf/simulated/floor/plasteel/whitered
+ icon_state = "whiteredfull"
+/turf/simulated/floor/plasteel/whitered/side
+ icon_state = "whitered"
+/turf/simulated/floor/plasteel/whitered/corner
+ icon_state = "whiteredcorner"
+
+
+
+/turf/simulated/floor/plasteel/blue
+ icon_state = "bluefull"
+/turf/simulated/floor/plasteel/blue/side
+ icon_state = "blue"
+/turf/simulated/floor/plasteel/blue/corner
+ icon_state = "bluecorner"
+
+/turf/simulated/floor/plasteel/darkblue
+ icon_state = "darkbluefull"
+/turf/simulated/floor/plasteel/darkblue/side
+ icon_state = "darkblue"
+/turf/simulated/floor/plasteel/darkblue/corner
+ icon_state = "darkbluecorners"
+
+/turf/simulated/floor/plasteel/whiteblue
+ icon_state = "whitebluefull"
+/turf/simulated/floor/plasteel/whiteblue/side
+ icon_state = "whiteblue"
+/turf/simulated/floor/plasteel/whiteblue/corner
+ icon_state = "whitebluecorner"
+
+
+
+/turf/simulated/floor/plasteel/yellow
+ icon_state = "yellowfull"
+/turf/simulated/floor/plasteel/yellow/side
+ icon_state = "yellow"
+/turf/simulated/floor/plasteel/yellow/corner
+ icon_state = "yellowcorner"
+
+/turf/simulated/floor/plasteel/darkyellow
+ icon_state = "darkyellowfull"
+/turf/simulated/floor/plasteel/darkyellow/side
+ icon_state = "darkyellow"
+/turf/simulated/floor/plasteel/darkyellow/corner
+ icon_state = "darkyellowcorners"
+
+/turf/simulated/floor/plasteel/whiteyellow
+ icon_state = "whiteyellowfull"
+/turf/simulated/floor/plasteel/whiteyellow/side
+ icon_state = "whiteyellow"
+/turf/simulated/floor/plasteel/whiteyellow/corner
+ icon_state = "whiteyellowcorner"
+
+
+
+/turf/simulated/floor/plasteel/purple
+ icon_state = "purplefull"
+/turf/simulated/floor/plasteel/purple/side
+ icon_state = "purple"
+/turf/simulated/floor/plasteel/purple/corner
+ icon_state = "purplecorner"
+
+/turf/simulated/floor/plasteel/darkpurple
+ icon_state = "darkpurplefull"
+/turf/simulated/floor/plasteel/darkpurple/side
+ icon_state = "darkpurple"
+/turf/simulated/floor/plasteel/darkpurple/corner
+ icon_state = "darkpurplecorners"
+
+/turf/simulated/floor/plasteel/whitepurple
+ icon_state = "whitepurplefull"
+/turf/simulated/floor/plasteel/whitepurple/side
+ icon_state = "whitepurple"
+/turf/simulated/floor/plasteel/whitepurple/corner
+ icon_state = "whitepurplecorner"
+
+
+/turf/simulated/floor/plasteel/orange
+ icon_state = "orangefull"
+/turf/simulated/floor/plasteel/orange/side
+ icon_state = "orange"
+/turf/simulated/floor/plasteel/orange/corner
+ icon_state = "orangecorner"
+
/turf/simulated/floor/plasteel/neutral
icon_state = "neutralfull"
@@ -61,12 +173,48 @@
icon_state = "neutralcorner"
+/turf/simulated/floor/plasteel/arrival
+ icon_state = "arrival"
+/turf/simulated/floor/plasteel/arrival/corner
+ icon_state = "arrivalcorner"
+
+
+/turf/simulated/floor/plasteel/escape
+ icon_state = "escape"
+/turf/simulated/floor/plasteel/escape/corner
+ icon_state = "escapecorner"
+
+
+/turf/simulated/floor/plasteel/caution
+ icon_state = "caution"
+/turf/simulated/floor/plasteel/caution/corner
+ icon_state = "cautioncorner"
+
+
/turf/simulated/floor/plasteel/warning
icon_state = "warning"
/turf/simulated/floor/plasteel/warning/corner
icon_state = "warningcorner"
+/turf/simulated/floor/plasteel/warnplate
+ icon_state = "warnplate"
+/turf/simulated/floor/plasteel/warnplate/corner
+ icon_state = "warnplatecorner"
+
+
+/turf/simulated/floor/plasteel/warnwhite
+ icon_state = "warnwhite"
+/turf/simulated/floor/plasteel/warnwhite/corner
+ icon_state = "warnwhitecorner"
+
+
+/turf/simulated/floor/plasteel/whitebot
+ icon_state = "whitebot"
+/turf/simulated/floor/plasteel/whitebot/delivery
+ icon_state = "whitedelivery"
+
+
/turf/simulated/floor/plasteel/redyellow
icon_state = "redyellowfull"
/turf/simulated/floor/plasteel/redyellow/side
@@ -75,15 +223,45 @@
/turf/simulated/floor/plasteel/redblue
icon_state = "redbluefull"
-/turf/simulated/floor/plasteel/redblue/side
+/turf/simulated/floor/plasteel/redblue/blueside
+ icon_state = "bluered"
+/turf/simulated/floor/plasteel/redblue/redside
icon_state = "redblue"
+/turf/simulated/floor/plasteel/redgreen
+ icon_state = "redgreenfull"
+/turf/simulated/floor/plasteel/redgreen/side
+ icon_state = "redgreen"
+
+
+/turf/simulated/floor/plasteel/greenyellow
+ icon_state = "greenyellowfull"
+/turf/simulated/floor/plasteel/greenyellow/side
+ icon_state = "greenyellow"
+
+
+/turf/simulated/floor/plasteel/greenblue
+ icon_state = "greenbluefull"
+/turf/simulated/floor/plasteel/greenblue/side
+ icon_state = "greenblue"
+
+
+/turf/simulated/floor/plasteel/blueyellow
+ icon_state = "blueyellowfull"
+/turf/simulated/floor/plasteel/blueyellow/side
+ icon_state = "blueyellow"
+
+
/turf/simulated/floor/plasteel/darkwarning
icon_state = "warndark"
/turf/simulated/floor/plasteel/darkwarning/corner
icon_state = "warndarkcorners"
+/turf/simulated/floor/plasteel/warningline
+ icon_state = "warningline"
+/turf/simulated/floor/plasteel/warningline/corner
+ icon_state = "warninglinecorners"
/turf/simulated/floor/plasteel/yellowsiding
icon_state = "yellowsiding"
@@ -97,12 +275,86 @@
icon_state = "podhatchcorner"
+
+/turf/simulated/floor/plasteel/circuit
+ icon_state = "bcircuit"
+/turf/simulated/floor/plasteel/circuit/off
+ icon_state = "bcircuitoff"
+
+/turf/simulated/floor/plasteel/circuit/gcircuit
+ icon_state = "gcircuit"
+/turf/simulated/floor/plasteel/circuit/gcircuit/off
+ icon_state = "gcircuitoff"
+/turf/simulated/floor/plasteel/circuit/gcircuit/animated
+ icon_state = "gcircuitanim"
+
+/turf/simulated/floor/plasteel/circuit/rcircuit
+ icon_state = "rcircuit"
+/turf/simulated/floor/plasteel/circuit/rcircuit/animated
+ icon_state = "rcircuitanim"
+
+
+
/turf/simulated/floor/plasteel/loadingarea
icon_state = "loadingarea"
+/turf/simulated/floor/plasteel/loadingarea/dirty
+ icon_state = "loadingareadirty1"
+/turf/simulated/floor/plasteel/loadingarea/dirtydirty
+ icon_state = "loadingareadirty2"
+
+
+/turf/simulated/floor/plasteel/shuttle
+ icon_state = "shuttlefloor"
+/turf/simulated/floor/plasteel/shuttle/red
+ name = "Brig floor"
+ icon_state = "shuttlefloor4"
+/turf/simulated/floor/plasteel/shuttle/yellow
+ icon_state = "shuttlefloor2"
+/turf/simulated/floor/plasteel/shuttle/white
+ icon_state = "shuttlefloor3"
+/turf/simulated/floor/plasteel/shuttle/purple
+ icon_state = "shuttlefloor5"
+
+
+/turf/simulated/floor/plasteel/asteroid
+ icon_state = "asteroidfloor"
+/turf/simulated/floor/plasteel/asteroid/warning
+ icon_state = "asteroidwarning"
+
+
+/turf/simulated/floor/plasteel/recharge_floor
+ icon_state = "recharge_floor"
+/turf/simulated/floor/plasteel/recharge_floor/asteroid
+ icon_state = "recharge_floor_asteroid"
+
+
+/turf/simulated/floor/plasteel/chapel
+ icon_state = "chapel"
+
+/turf/simulated/floor/plasteel/showroomfloor
+ icon_state = "showroomfloor"
+
+/turf/simulated/floor/plasteel/floorgrime
+ icon_state = "floorgrime"
+
+/turf/simulated/floor/plasteel/solarpanel
+ icon_state = "solarpanel"
+
+/turf/simulated/floor/plasteel/cmo
+ icon_state = "cmo"
+
+/turf/simulated/floor/plasteel/barber
+ icon_state = "barber"
+
+/turf/simulated/floor/plasteel/hydrofloor
+ icon_state = "hydrofloor"
/turf/simulated/floor/plasteel/delivery
icon_state = "delivery"
+/turf/simulated/floor/plasteel/bot
+ icon_state = "bot"
+
/turf/simulated/floor/plasteel/freezer
icon_state = "freezerfloor"
@@ -115,10 +367,18 @@
/turf/simulated/floor/plasteel/cafeteria
icon_state = "cafeteria"
+/turf/simulated/floor/plasteel/vault
+ icon_state = "vault"
+
/turf/simulated/floor/plasteel/cult
icon_state = "cult"
name = "engraved floor"
+/turf/simulated/floor/plasteel/goonplaque
+ icon_state = "plaque"
+ name = "Commemorative Plaque"
+ desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."
+
/turf/simulated/floor/plasteel/cult/narsie_act()
return
@@ -127,9 +387,61 @@
nitrogen = 0
temperature = TCMB
-/turf/simulated/floor/plasteel/shuttle
- icon_state = "shuttlefloor"
-/turf/simulated/floor/plasteel/shuttle/red
- name = "Brig floor"
- icon_state = "shuttlefloor4"
\ No newline at end of file
+
+
+
+
+//
+//unused? remove?
+//
+/turf/simulated/floor/plasteel/stage_bottom
+ icon_state = "stage_bottom"
+/turf/simulated/floor/plasteel/stage_left
+ icon_state = "stage_left"
+/turf/simulated/floor/plasteel/stage_bleft
+ icon_state = "stage_bleft"
+
+
+/turf/simulated/floor/plasteel/stairs
+ icon_state = "stairs"
+/turf/simulated/floor/plasteel/stairs/left
+ icon_state = "stairs-l"
+/turf/simulated/floor/plasteel/stairs/medium
+ icon_state = "stairs-m"
+/turf/simulated/floor/plasteel/stairs/right
+ icon_state = "stairs-r"
+/turf/simulated/floor/plasteel/stairs/old
+ icon_state = "stairs-old"
+
+
+/turf/simulated/floor/plasteel/brownold
+ icon_state = "brownold"
+/turf/simulated/floor/plasteel/brownold/corner
+ icon_state = "browncornerold"
+
+
+/turf/simulated/floor/plasteel/rockvault
+ icon_state = "rockvault"
+/turf/simulated/floor/plasteel/rockvault/alien
+ icon_state = "alienvault"
+/turf/simulated/floor/plasteel/rockvault/sandstone
+ icon_state = "sandstonevault"
+
+
+/turf/simulated/floor/plasteel/elevatorshaft
+ icon_state = "elevatorshaft"
+
+/turf/simulated/floor/plasteel/bluespace
+ icon_state = "bluespace"
+
+/turf/simulated/floor/plasteel/sepia
+ icon_state = "sepia"
+
+
+/turf/simulated/floor/plasteel/sandeffect
+ icon_state = "sandeffect"
+/turf/simulated/floor/plasteel/sandeffect/warning
+ icon_state = "warningsandeffect"
+/turf/simulated/floor/plasteel/sandeffect/warning/corner
+ icon_state = "warningsandeffectcorners"
\ No newline at end of file
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index 7e9adfb9295..83bde628fd0 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -1,7 +1,7 @@
/*
HOW DO I LOG RUNTIMES?
Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key)
- navigate the popup window to the data/logs/runtime/ folder from where your tgstation .dmb is located.
+ navigate the popup window to the data/logs/runtimes/ folder from where your tgstation .dmb is located.
(you may have to make this folder yourself)
OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you
@@ -44,7 +44,7 @@
set desc = "Retrieve any session logfiles saved by dreamdeamon."
set category = null
- var/path = browse_files("data/logs/runtime/")
+ var/path = browse_files("data/logs/runtimes/")
if(!path)
return
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 06bdfc347d6..334c76fca27 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -10,6 +10,7 @@
var/basestate = "hardsuit"
var/brightness_on = 4 //luminosity when on
var/on = 0
+ var/obj/item/clothing/suit/space/hardsuit/suit
item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
action_button_name = "Toggle Helmet Light"
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index d8dc137f797..a9a1d0f6133 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -105,7 +105,7 @@
/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone)
if(!(def_zone in list("chest", "groin"))) //If not shot where ablative is covering you, you don't get the reflection bonus!
- hit_reflect_chance = 0
+ return 0
if (prob(hit_reflect_chance))
return 1
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index d8d1f409691..9a3efc5d2ad 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -90,7 +90,6 @@
user << "Alt-click on [src] to toggle the [togglename]."
//Hardsuit toggle code
-
/obj/item/clothing/suit/space/hardsuit/New()
MakeHelmet()
if(!jetpack)
@@ -98,15 +97,24 @@
verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets
..()
/obj/item/clothing/suit/space/hardsuit/Destroy()
- qdel(helmet)
+ if(helmet)
+ helmet.suit = null
+ qdel(helmet)
qdel(jetpack)
..()
+/obj/item/clothing/head/helmet/space/hardsuit/Destroy()
+ if(suit)
+ suit.helmet = null
+ qdel(suit)
+ ..()
+
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
if(!helmettype)
return
if(!helmet)
var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src)
+ W.suit = src
helmet = W
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
@@ -121,7 +129,7 @@
..()
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
- if(!helmettype)
+ if(!helmet)
return
suittoggled = 0
if(ishuman(helmet.loc))
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 9a55d77b4ad..f373fad4af6 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -7,7 +7,6 @@
/datum/round_event/brand_intelligence
announceWhen = 21
endWhen = 1000 //Ends when all vending machines are subverted anyway.
-
var/list/obj/machinery/vending/vendingMachines = list()
var/list/obj/machinery/vending/infectedMachines = list()
var/obj/machinery/vending/originMachine
@@ -28,11 +27,9 @@
for(var/obj/machinery/vending/V in machines)
if(V.z != 1) continue
vendingMachines.Add(V)
-
if(!vendingMachines.len)
kill()
return
-
originMachine = pick(vendingMachines)
vendingMachines.Remove(originMachine)
originMachine.shut_up = 0
@@ -48,7 +45,7 @@
originMachine.visible_message("[originMachine] beeps and seems lifeless.")
kill()
return
-
+ vendingMachines = removeNullsFromList(vendingMachines)
if(!vendingMachines.len) //if every machine is infected
for(var/obj/machinery/vending/upriser in infectedMachines)
if(prob(70) && !upriser.gc_destroyed)
@@ -62,7 +59,6 @@
kill()
return
-
if(IsMultiple(activeFor, 4))
var/obj/machinery/vending/rebel = pick(vendingMachines)
vendingMachines.Remove(rebel)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index c633246b3e4..7f87245bf41 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -66,7 +66,6 @@
color = "#aa77aa"
icon_state = "vinefloor"
broken_states = list()
- ignoredirt = 1
//All of this shit is useless for vines
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 98a01e01182..64a7e9fc72f 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -188,19 +188,20 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(!U.welded)
pump = U
break
- xeno = new(pump.loc,target)
- sleep(10)
- xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
- sleep(10)
- xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
- sleep(10)
- var/xeno_name = xeno.name
- target << "[xeno_name] begins climbing into the ventilation system..."
- sleep(10)
- qdel(xeno)
- target << "[xeno_name] scrambles into the ventilation ducts!"
+ if(pump)
+ xeno = new(pump.loc,target)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
+ sleep(10)
+ var/xeno_name = xeno.name
+ target << "[xeno_name] begins climbing into the ventilation system..."
+ sleep(10)
+ qdel(xeno)
+ target << "[xeno_name] scrambles into the ventilation ducts!"
qdel(src)
/obj/effect/hallucination/singularity_scare
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index f0e699253be..36b7e7e4eb4 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -573,6 +573,7 @@
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
+ item_state = "facehugger_inactive"
desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
throwforce = 0
real = 0
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 24a358a10b2..955d80d3f0e 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -509,7 +509,6 @@ var/global/list/rockTurfEdgeCache
icon_state = "asteroid"
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
- ignoredirt = 1
/turf/simulated/floor/plating/asteroid/airless
oxygen = 0.01
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index e1089f54ac3..efaac579681 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -326,7 +326,9 @@
flick("coin_[cmineral]_flip", src)
icon_state = "coin_[cmineral]_[coinflip]"
playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
- if(do_after(user, 15, target = src))
+ var/oldloc = loc
+ sleep(15)
+ if(loc == oldloc && user && !user.incapacitated())
user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \
"You flip [src]. It lands on [coinflip].", \
"You hear the clattering of loose change.")
\ No newline at end of file
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index 12d822561f4..d4d7952c4a2 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -293,7 +293,9 @@
/mob/living/carbon/human/interactive/Life()
..()
- if(isnotfunc()) return
+ if(isnotfunc())
+ walk(src,0)
+ return
if(a_intent != "disarm")
a_intent = "disarm"
//---------------------------
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index fd3fff64a4b..20577531b27 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -73,7 +73,19 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
+ switch(M.melee_damage_type)
+ if(BRUTE)
+ adjustBruteLoss(damage)
+ if(BURN)
+ adjustFireLoss(damage)
+ if(TOX)
+ adjustToxLoss(damage)
+ if(OXY)
+ adjustOxyLoss(damage)
+ if(CLONE)
+ adjustCloneLoss(damage)
+ if(STAMINA)
+ adjustStaminaLoss(damage)
updatehealth()
/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
index 5270fdabb6d..6129dd7ef77 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/alien/humanoid/emote(act)
+/mob/living/carbon/alien/humanoid/emote(act,m_type=1,message = null)
var/param = null
if (findtext(act, "-", 1, null))
@@ -7,8 +7,6 @@
act = copytext(act, 1, t1)
var/muzzled = is_muzzled()
- var/m_type = 1
- var/message
switch(act) //Alphabetical please
if ("deathgasp","deathgasps")
@@ -25,6 +23,10 @@
message = "[src] hisses."
m_type = 2
+ if ("me")
+ ..()
+ return
+
if ("moan","moans")
message = "[src] moans!"
m_type = 2
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index a3e1ff31665..4a190c27c7d 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -14,7 +14,6 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
- create_reagents(1000)
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 03745eb7306..540fc3874fd 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -10,8 +10,6 @@
/mob/living/carbon/alien/humanoid/queen/New()
- create_reagents(100)
-
//there should only be one queen
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
if(Q == src) continue
@@ -77,17 +75,3 @@
icon_state = "queen_s"
pixel_x = -16
mob_size = MOB_SIZE_LARGE
-
-/mob/living/carbon/alien/humanoid/queen/large/update_icons()
- update_hud() //TODO: remove the need for this to be here
- overlays.Cut()
- if(stat == DEAD)
- icon_state = "queen_dead"
- else if((stat == UNCONSCIOUS && !sleeping) || weakened)
- icon_state = "queen_l"
- else if(sleeping || lying || resting)
- icon_state = "queen_sleep"
- else
- icon_state = "queen_s"
- for(var/image/I in overlays_standing)
- overlays += I
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 1495d4f99d3..de272e0c0d7 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -50,4 +50,29 @@
if(lying > 0)
lying = 90 //Anything else looks retarded
..()
- update_icons()
\ No newline at end of file
+ update_icons()
+
+
+/mob/living/carbon/alien/humanoid/queen/large/update_icons()
+ update_hud() //TODO: remove the need for this to be here
+ overlays.Cut()
+ if(stat == DEAD)
+ icon_state = "queen_dead"
+ else if((stat == UNCONSCIOUS && !sleeping) || weakened)
+ icon_state = "queen_l"
+ else if(sleeping || lying || resting)
+ icon_state = "queen_sleep"
+ else
+ icon_state = "queen_s"
+ for(var/image/I in overlays_standing)
+ overlays += I
+
+/mob/living/carbon/alien/humanoid/queen/large/update_inv_l_hand()
+ remove_overlay(L_HAND_LAYER)
+ if(handcuffed)
+ drop_l_hand()
+
+/mob/living/carbon/alien/humanoid/queen/large/update_inv_r_hand()
+ remove_overlay(R_HAND_LAYER)
+ if(handcuffed)
+ drop_r_hand()
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index b7db238a99a..15573748de6 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -73,15 +73,17 @@
/obj/item/organ/internal/alien/plasmavessel/on_life()
//If there are alien weeds on the ground then heal if needed or give some plasma
if(locate(/obj/structure/alien/weeds) in owner.loc)
- if(owner.health >= owner.maxHealth - owner.getCloneLoss())
+ if(owner.health >= owner.maxHealth)
owner.adjustPlasma(plasma_rate)
else
- var/mod = 1
+ var/heal_amt = heal_rate
if(!isalien(owner))
- mod = 0.2
- owner.adjustBruteLoss(-heal_rate*mod)
- owner.adjustFireLoss(-heal_rate*mod)
- owner.adjustOxyLoss(-heal_rate*mod)
+ heal_amt *= 0.2
+ owner.adjustPlasma(plasma_rate*0.5)
+ owner.adjustBruteLoss(-heal_amt)
+ owner.adjustFireLoss(-heal_amt)
+ owner.adjustOxyLoss(-heal_amt)
+ owner.adjustCloneLoss(-heal_amt)
/obj/item/organ/internal/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0)
..()
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index a674add3ff1..c1009164427 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -3,16 +3,20 @@
if(.)
playsound(loc, "hiss", 25, 1, 1) //erp just isn't the same without sound feedback
-/mob/living/proc/alien_talk(message)
+/mob/living/proc/alien_talk(message, shown_name = name)
log_say("[key_name(src)] : [message]")
message = trim(message)
if(!message) return
var/message_a = say_quote(message)
- var/rendered = "Hivemind, [name] [message_a]"
+ var/rendered = "Hivemind, [shown_name] [message_a]"
for(var/mob/S in player_list)
if((!S.stat && S.hivecheck()) || (S in dead_mob_list))
S << rendered
+/mob/living/carbon/alien/humanoid/queen/alien_talk(message, shown_name = name)
+ shown_name = "[shown_name]"
+ ..(message, shown_name)
+
/mob/living/carbon/hivecheck()
return getorgan(/obj/item/organ/internal/alien/hivenode)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 1a9ba9601a2..d4f997ddf7b 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -187,7 +187,6 @@ var/const/MAX_ACTIVE_TIME = 400
else
target.visible_message("[src] violates [target]'s face!", \
"[src] violates [target]'s face!")
- return
/obj/item/clothing/mask/facehugger/proc/GoActive()
if(stat == DEAD || stat == CONSCIOUS)
@@ -196,20 +195,10 @@ var/const/MAX_ACTIVE_TIME = 400
stat = CONSCIOUS
icon_state = "[initial(icon_state)]"
-/* for(var/mob/living/carbon/alien/alien in world)
- var/image/activeIndicator = image('icons/mob/alien.dmi', loc = src, icon_state = "facehugger_active")
- activeIndicator.override = 1
- if(alien && alien.client)
- alien.client.images += activeIndicator */
-
- return
-
/obj/item/clothing/mask/facehugger/proc/GoIdle()
if(stat == DEAD || stat == UNCONSCIOUS)
return
-/* RemoveActiveIndicators() */
-
stat = UNCONSCIOUS
icon_state = "[initial(icon_state)]_inactive"
@@ -221,15 +210,12 @@ var/const/MAX_ACTIVE_TIME = 400
if(stat == DEAD)
return
-/* RemoveActiveIndicators() */
-
icon_state = "[initial(icon_state)]_dead"
+ item_state = "facehugger_inactive"
stat = DEAD
visible_message("[src] curls up into a ball!")
- return
-
/proc/CanHug(mob/living/M)
if(!istype(M))
return 0
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 3eec0aa657d..44594f60c67 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -8,10 +8,6 @@
var/alert = null
has_limbs = 0
-/mob/living/carbon/brain/New()
- create_reagents(1000)
- ..()
-
/mob/living/carbon/brain/Destroy()
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
if(stat!=DEAD) //If not dead.
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 8fdb1c39ccf..bf6ee02563f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1,3 +1,7 @@
+/mob/living/carbon/New()
+ create_reagents(1000)
+ ..()
+
/mob/living/carbon/prepare_huds()
..()
prepare_data_huds()
@@ -74,9 +78,9 @@
. = ..()
-/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0)
+/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, override = 0)
shock_damage *= siemens_coeff
- if (shock_damage<1)
+ if(shock_damage<1 && !override)
return 0
take_overall_damage(0,shock_damage)
//src.burn_skin(shock_damage)
@@ -95,7 +99,10 @@
jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less
Stun(3)
Weaken(3)
- return shock_damage
+ if(override)
+ return override
+ else
+ return shock_damage
/mob/living/carbon/swap_hand()
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 2009c2bc5fe..1f1717517df 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -111,6 +111,11 @@
else
message = "[src] makes a noise."
+ if ("me")
+ if(!silent)
+ ..()
+ return
+
if ("nod","nods")
message = "[src] nods."
m_type = 1
diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/examine.dm
similarity index 65%
rename from code/modules/mob/living/carbon/monkey/examine.dm
rename to code/modules/mob/living/carbon/examine.dm
index 48963b00eed..e46f62193d8 100644
--- a/code/modules/mob/living/carbon/monkey/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -1,45 +1,58 @@
-/mob/living/carbon/monkey/examine(mob/user)
- var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
-
- if (src.handcuffed)
- msg += "It is \icon[src.handcuffed] handcuffed!\n"
- if (src.head)
- msg += "It has \icon[src.head] \a [src.head] on its head. \n"
- if (src.wear_mask)
- msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n"
- if (src.l_hand)
- msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
- if (src.r_hand)
- msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n"
- if (src.back)
- msg += "It has \icon[src.back] \a [src.back] on its back.\n"
- if (src.stat == DEAD)
- msg += "It is limp and unresponsive, with no signs of life.\n"
- else
- msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < 30)
- msg += "It has minor bruising.\n"
- else
- msg += "It has severe bruising!\n"
- if (src.getFireLoss())
- if (src.getFireLoss() < 30)
- msg += "It has minor burns.\n"
- else
- msg += "It has severe burns!\n"
-
- if (src.fire_stacks > 0)
- msg += "It's covered in something flammable.\n"
- if (src.fire_stacks < 0)
- msg += "It's soaked in water.\n"
-
- if (src.stat == UNCONSCIOUS)
- msg += "It isn't responding to anything around it; it seems to be asleep.\n"
- msg += ""
-
- if (src.digitalcamo)
- msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n"
-
- msg += "*---------*"
-
+/mob/living/carbon/examine(mob/user)
+ var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
+
+ if (handcuffed)
+ msg += "It is \icon[src.handcuffed] handcuffed!\n"
+ if (head)
+ msg += "It has \icon[src.head] \a [src.head] on its head. \n"
+ if (wear_mask)
+ msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n"
+ if (l_hand)
+ msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
+ if (r_hand)
+ msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n"
+ if (back)
+ msg += "It has \icon[src.back] \a [src.back] on its back.\n"
+ if (stat == DEAD)
+ msg += "It is limp and unresponsive, with no signs of life.\n"
+ else
+ msg += ""
+ var/temp = getBruteLoss()
+ if(temp)
+ if (temp < 30)
+ msg += "It has minor bruising.\n"
+ else
+ msg += "It has severe bruising!\n"
+
+ temp = getFireLoss()
+ if(temp)
+ if (temp < 30)
+ msg += "It has minor burns.\n"
+ else
+ msg += "It has severe burns!\n"
+
+ temp = getCloneLoss()
+ if(temp)
+ if(getCloneLoss() < 30)
+ msg += "It is slightly deformed.\n"
+ else
+ msg += "It is severely deformed.\n"
+
+ if(getBrainLoss() > 60)
+ msg += "It seems to be clumsy and unable to think.\n"
+
+ if(fire_stacks > 0)
+ msg += "It's covered in something flammable.\n"
+ if(fire_stacks < 0)
+ msg += "It's soaked in water.\n"
+
+ if(stat == UNCONSCIOUS)
+ msg += "It isn't responding to anything around it; it seems to be asleep.\n"
+ msg += ""
+
+ if (digitalcamo)
+ msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n"
+
+ msg += "*---------*"
+
user << msg
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ec19362de9b..7a52ea7fbdb 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -14,7 +14,6 @@
/mob/living/carbon/human/New()
- create_reagents(1000)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
//initialise organs
@@ -270,7 +269,7 @@
spreadFire(AM)
//Added a safety check in case you want to shock a human mob directly through electrocute_act.
-/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0)
+/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0, override = 0)
if(!safety)
if(gloves)
var/obj/item/clothing/gloves/G = gloves
@@ -280,8 +279,7 @@
heart_attack = 0
if(stat == CONSCIOUS)
src << "You feel your heart beating again!"
-
- . = ..(shock_damage,source,siemens_coeff)
+ . = ..(shock_damage,source,siemens_coeff,safety,override)
if(.)
electrocution_animation(40)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7a39b9969fe..98a8c3b6eed 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -389,7 +389,7 @@ emp_act
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
var/armor = run_armor_check(affecting, "melee")
- apply_damage(damage, BRUTE, affecting, armor)
+ apply_damage(damage, M.melee_damage_type, affecting, armor)
updatehealth()
diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm
index 42adb99ec59..b2b739109b2 100644
--- a/code/modules/mob/living/carbon/monkey/emote.dm
+++ b/code/modules/mob/living/carbon/monkey/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/monkey/emote(act)
+/mob/living/carbon/monkey/emote(act,m_type=1,message = null)
var/param = null
if (findtext(act, "-", 1, null))
@@ -6,10 +6,7 @@
param = copytext(act, t1 + 1, length(act) + 1)
act = copytext(act, 1, t1)
-
var/muzzled = is_muzzled()
- var/m_type = 1
- var/message
switch(act) //Ooh ooh ah ah keep this alphabetical ooh ooh ah ah!
if ("deathgasp","deathgasps")
@@ -21,15 +18,19 @@
message = "[src] gnarls and shows its teeth.."
m_type = 2
- if ("paw")
- if (!src.restrained())
- message = "[src] flails its paw."
- m_type = 1
+ if ("me")
+ ..()
+ return
if ("moan","moans")
message = "[src] moans!"
m_type = 2
+ if ("paw")
+ if (!src.restrained())
+ message = "[src] flails its paw."
+ m_type = 1
+
if ("roar","roars")
if (!muzzled)
message = "[src] roars."
@@ -67,7 +68,7 @@
src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, gnarl, giggle, glare-(none)/mob, grin, jump, laugh, look, me, moan, nod, paw, point-(atom), roar, roll, scream, scratch, screech, shake, shiver, sigh, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave whimper, wink, yawn"
else
- ..(act)
+ ..()
if ((message && src.stat == 0))
if(src.client)
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 5f721ecb512..f8aebb101fa 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -13,7 +13,6 @@
unique_name = 1
/mob/living/carbon/monkey/New()
- create_reagents(1000)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
@@ -155,7 +154,19 @@
/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
+ switch(M.melee_damage_type)
+ if(BRUTE)
+ adjustBruteLoss(damage)
+ if(BURN)
+ adjustFireLoss(damage)
+ if(TOX)
+ adjustToxLoss(damage)
+ if(OXY)
+ adjustOxyLoss(damage)
+ if(CLONE)
+ adjustCloneLoss(damage)
+ if(STAMINA)
+ adjustStaminaLoss(damage)
updatehealth()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f22de8919e0..f5a452c3ac3 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -862,9 +862,6 @@
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
- if (istype(tile, /turf/simulated/floor))
- var/turf/simulated/floor/F = tile
- F.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 83b20b450cb..1a42c2e82f2 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -381,7 +381,19 @@
/mob/living/silicon/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
+ switch(M.melee_damage_type)
+ if(BRUTE)
+ adjustBruteLoss(damage)
+ if(BURN)
+ adjustFireLoss(damage)
+ if(TOX)
+ adjustToxLoss(damage)
+ if(OXY)
+ adjustOxyLoss(damage)
+ if(CLONE)
+ adjustCloneLoss(damage)
+ if(STAMINA)
+ adjustStaminaLoss(damage)
updatehealth()
/mob/living/silicon/attack_paw(mob/living/user)
diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
new file mode 100644
index 00000000000..bbed56a6962
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
@@ -0,0 +1,513 @@
+////Deactivated swarmer shell////
+/obj/item/unactivated_swarmer
+ name = "unactivated swarmer"
+ desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this."
+ icon = 'icons/mob/swarmer.dmi'
+ icon_state = "swarmer_unactivated"
+
+/obj/item/unactivated_swarmer/attack_ghost(mob/user)
+ var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No")
+ if(be_swarmer == "No" || qdeleted())
+ return
+ var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc))
+ S.key = user.key
+ qdel(src)
+
+////The Mob itself////
+
+/mob/living/simple_animal/hostile/swarmer
+ name = "Swarmer"
+ unique_name = 1
+ icon = 'icons/mob/swarmer.dmi'
+ desc = "A robot of unknown design, they seek only to consume materials and replicate themselves indefinitely."
+ speak_emote = list("tones")
+ health = 40
+ maxHealth = 40
+ status_flags = CANPUSH
+ icon_state = "swarmer"
+ icon_living = "swarmer"
+ icon_dead = "swarmer_unactivated"
+ icon_gib = null
+ wander = 0
+ harm_intent_damage = 5
+ minbodytemp = 0
+ maxbodytemp = 500
+ 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)
+ languages = SWARMER
+ environment_smash = 0
+ attacktext = "shocks"
+ attack_sound = 'sound/effects/EMPulse.ogg'
+ friendly = "pinches"
+ speed = 0
+ faction = list("swarmer")
+ AIStatus = AI_OFF
+ projectiletype = /obj/item/projectile/beam/disabler
+ pass_flags = PASSTABLE | PASSMOB
+ ventcrawler = 2
+ ranged = 1
+ projectiletype = /obj/item/projectile/beam/disabler
+ ranged_cooldown_cap = 2
+ projectilesound = 'sound/weapons/taser2.ogg'
+ var/resources = 0 //Resource points, generated by consuming metal/glass
+
+/mob/living/simple_animal/hostile/swarmer/Login()
+ ..()
+ src << "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate."
+ src << "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you."
+ src << "Objectives:"
+ src << "1. Consume resources and replicate until there are no more resources left."
+ src << "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable."
+ src << "3. Biological resources will be harvested at a later date, do not harm them."
+
+/mob/living/simple_animal/hostile/swarmer/New()
+ ..()
+ verbs -= /mob/living/verb/pulled
+
+/mob/living/simple_animal/hostile/swarmer/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat("Resources:",resources)
+
+/mob/living/simple_animal/hostile/swarmer/death(gibbed)
+ ..(gibbed)
+ new /obj/effect/decal/cleanable/robot_debris(src.loc)
+ ghostize()
+ qdel(src)
+
+/mob/living/simple_animal/hostile/swarmer/emp_act()
+ if(health > 1)
+ health = 1
+ ..()
+ health = 0
+
+/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
+ if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
+ return 1
+ if(isswarmer(O))
+ return 1
+ ..()
+
+////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
+/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)
+ face_atom(A)
+ if(!isturf(loc))
+ return
+ if(next_move > world.time)
+ return
+ if(!A.Adjacent(src))
+ return
+ A.swarmer_act(src)
+ return
+
+/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.Integrate(src)
+
+/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory
+ return
+
+/turf/simulated/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
+ return
+
+/obj/machinery/atmospherics/swarmer_act()
+ return
+
+/obj/structure/disposalpipe/swarmer_act()
+ return
+
+/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DismantleMachine(src)
+
+/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+ deactivate(S, 0)
+
+/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine
+ S.DisIntegrate(src)
+
+/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisIntegrate(src)
+
+/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "The volatile chemicals in this machine would destroy us. Aborting."
+
+/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "This device's destruction would result in the extermination of everything in the area. Aborting."
+
+/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "Destroying this object would cause a chain reaction. Aborting."
+
+/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "Disrupting the power grid would bring no benefit to us. Aborting."
+
+/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "An inhospitable area may be created as a result of destroying this object. Aborting."
+
+/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "Disrupting the power grid would bring no benefit to us. Aborting."
+
+/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "This bluespace source will be important to us later. Aborting."
+
+/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ if(locate(/turf/space) in range(1, src))
+ S << "Destroying this object has the potential to cause a hull breach. Aborting."
+ return
+ ..()
+
+/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ if(locate(/turf/space) in range(1, src))
+ S << "Destroying this object has the potential to cause a hull breach. Aborting."
+ return
+ ..()
+
+/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
+ S << "This object does not contain enough materials to work with."
+
+/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting."
+
+/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S.DisperseTarget(src)
+
+/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "This biological resource is somehow resisting our bluespace transceiver. Aborting."
+
+
+////END CTRL CLICK FOR SWARMERS////
+
+/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0)
+ if(!isturf(loc))
+ src << "This is not a suitable location for fabrication. We need more space."
+ if(resources >= fabrication_cost)
+ resources -= fabrication_cost
+ else
+ src << "You do not have the necessary resources to fabricate this object."
+ return 0
+ new fabrication_object(loc)
+ return 1
+
+/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target)
+ if(resources >= 100)
+ src << "We cannot hold more materials!"
+ return
+ if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))
+ resources++
+ do_attack_animation(target)
+ changeNext_move(CLICK_CD_MELEE)
+ if(istype(target, /obj/item/stack))
+ var/obj/item/stack/S = target
+ S.use(1)
+ if(S.amount)
+ return
+ qdel(target)
+ else
+ src << "\the [target] is incompatible with our internal matter recycler."
+ return
+
+/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target)
+ new /obj/effect/effect/sparks(get_turf(target))
+ do_attack_animation(target)
+ changeNext_move(CLICK_CD_MELEE)
+ target.ex_act(3)
+ return
+
+/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target)
+ if(target != src)
+ src << "Attempting to remove this being from our presence."
+ if(src.z != ZLEVEL_STATION)
+ src << "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area."
+ return
+ if(do_mob(src, target, 30))
+ var/cycle
+ for(cycle=0,cycle<100,cycle++)
+ var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station
+ if(istype(random_location, /turf/simulated/floor))
+ var/turf/simulated/floor/F = random_location
+ if(F.air)
+ var/datum/gas_mixture/A = F.air
+ if(A.oxygen >= 16 && !A.toxins && A.carbon_dioxide < 10 && !A.trace_gases.len)//Can most things breathe in this location?
+ if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold
+ var/pressure = A.return_pressure()
+ if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums
+ if(ishuman(target))//If we're getting rid of a human, slap some zipties on them to keep them away from us a little longer
+ var/obj/item/weapon/restraints/handcuffs/cable/zipties/Z = new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)
+ var/mob/living/carbon/human/H = target
+ Z.apply_cuffs(H, src)
+ do_teleport(target, F, 0)
+ playsound(src,'sound/effects/sparks4.ogg',50,1)
+ break
+ return
+
+/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)
+ do_attack_animation(target)
+ src << "We begin to dismantle this machine. We will need to be uninterrupted."
+ new /obj/effect/effect/sparks(get_turf(target))
+ if(do_mob(src, target, 100))
+ src << "Dismantling complete."
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)
+ M.amount = 5
+ for(var/obj/item/I in target.component_parts)
+ I.loc = M.loc
+ new /obj/effect/effect/sparks(get_turf(target))
+ target.dropContents()
+ if(istype(target, /obj/machinery/computer))
+ var/obj/machinery/computer/C = target
+ if(C.circuit)
+ C.circuit.loc = M.loc
+ qdel(target)
+
+/obj/effect/swarmer //Default destroyable object for swarmer constructions
+ name = "swarmer construction"
+ desc = "Debug swarmer item, this shouldn't be here. Yell at a coder."
+ gender = NEUTER
+ icon = 'icons/mob/swarmer.dmi'
+ icon_state = "ui_light"
+ luminosity = 1
+ var/health = 30
+
+/obj/effect/swarmer/proc/TakeDamage(damage)
+ health -= damage
+ if(health <= 0)
+ qdel(src)
+
+/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj)
+ if(Proj.damage)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ TakeDamage(Proj.damage)
+ ..()
+
+/obj/effect/swarmer/attackby(obj/item/weapon/I, mob/living/user, params)
+ if(istype(I, /obj/item/weapon))
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+ TakeDamage(I.force)
+ return
+
+/obj/effect/swarmer/ex_act()
+ qdel(src)
+ return
+
+/obj/effect/swarmer/blob_act()
+ qdel(src)
+ return
+
+/obj/effect/swarmer/attack_animal(mob/living/user)
+ if(isanimal(user))
+ var/mob/living/simple_animal/S = user
+ S.do_attack_animation(src)
+ user.changeNext_move(CLICK_CD_MELEE)
+ if(S.melee_damage_type == BRUTE || S.melee_damage_type == BURN)
+ TakeDamage(rand(S.melee_damage_lower, S.melee_damage_upper))
+ return
+
+/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
+ set name = "Create trap"
+ set category = "Swarmer"
+ set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
+ if(/obj/effect/swarmer/trap in loc)
+ src << "There is already a trap here. Aborting."
+ return
+ Fabricate(/obj/effect/swarmer/trap, 5)
+ return
+
+/obj/effect/swarmer/trap
+ name = "swarmer trap"
+ desc = "A quickly assembled electric trap. Will not retain its form if damaged enough."
+ icon_state = "trap"
+ luminosity = 1
+ health = 10
+
+/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
+ L.electrocute_act(0, src, 1, 1)
+ qdel(src)
+ ..()
+
+/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()
+ set name = "Create barricade"
+ set category = "Swarmer"
+ set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through."
+ if(/obj/effect/swarmer/blockade in loc)
+ src << "There is already a blockade here. Aborting."
+ return
+ Fabricate(/obj/effect/swarmer/blockade, 5)
+ return
+
+/obj/effect/swarmer/blockade
+ name = "swarmer blockade"
+ desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
+ icon_state = "barricade"
+ luminosity = 1
+ health = 50
+ density = 1
+ anchored = 1
+
+/obj/effect/swarmer/blockade/CanPass(atom/movable/O)
+ if(isswarmer(O))
+ return 1
+ if(istype(O, /obj/item/projectile/beam/disabler))
+ return 1
+
+/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()
+ set name = "Replicate"
+ set category = "Swarmer"
+ set desc = "Creates a shell for a new swarmer. Swarmers will self activate."
+ src << "We are attempting to replicate ourselves. We will need to stand still until the process is complete."
+ if(resources < 50)
+ src << "We do not have the resources for this!"
+ return
+ if(!isturf(loc))
+ src << "This is not a suitable location for replicating ourselves. We need more room."
+ return
+ if(do_mob(src, src, 100))
+ if(Fabricate(/obj/item/unactivated_swarmer, 50))
+ playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1)
+
+/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf()
+ set name = "Self Repair"
+ set category = "Swarmer"
+ set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete."
+ if(!isturf(loc))
+ return
+ src << "Attempting to repair damage to our body, stand by..."
+ if(do_mob(src, src, 100))
+ adjustBruteLoss(-100)
+ src << "We successfully repaired ourselves."
+
+/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight()
+ if(!luminosity)
+ SetLuminosity(3)
+ else
+ SetLuminosity(0)
+
+/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()
+ var/message = input(src, "Announce to other swarmers", "Swarmer contact")
+ if(message)
+ for(var/mob/M in mob_list)
+ if(isswarmer(M) || (M in dead_mob_list))
+ M << "Swarm communication - [M] states: [message]"
+
+
+
+////HUD NONSENSE////
+/obj/screen/swarmer
+ icon = 'icons/mob/swarmer.dmi'
+
+/obj/screen/swarmer/FabricateTrap
+ icon_state = "ui_trap"
+ name = "Create trap"
+ desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)"
+
+/obj/screen/swarmer/FabricateTrap/Click()
+ if(isswarmer(usr))
+ var/mob/living/simple_animal/hostile/swarmer/S = usr
+ S.CreateTrap()
+
+/obj/screen/swarmer/Barricade
+ icon_state = "ui_barricade"
+ name = "Create barricade"
+ desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)"
+
+/obj/screen/swarmer/Barricade/Click()
+ if(isswarmer(usr))
+ var/mob/living/simple_animal/hostile/swarmer/S = usr
+ S.CreateBarricade()
+
+/obj/screen/swarmer/Replicate
+ icon_state = "ui_replicate"
+ name = "Replicate"
+ desc = "Creates a another of our kind. (Costs 50 resources)"
+
+/obj/screen/swarmer/Replicate/Click()
+ if(isswarmer(usr))
+ var/mob/living/simple_animal/hostile/swarmer/S = usr
+ S.CreateSwarmer()
+
+/obj/screen/swarmer/RepairSelf
+ icon_state = "ui_self_repair"
+ name = "Repair self"
+ desc = "Repairs damage to our body."
+
+/obj/screen/swarmer/RepairSelf/Click()
+ if(isswarmer(usr))
+ var/mob/living/simple_animal/hostile/swarmer/S = usr
+ S.RepairSelf()
+
+/obj/screen/swarmer/ToggleLight
+ icon_state = "ui_light"
+ name = "Toggle light"
+ desc = "Toggles our inbuilt light on or off."
+
+/obj/screen/swarmer/ToggleLight/Click()
+ if(isswarmer(usr))
+ var/mob/living/simple_animal/hostile/swarmer/S = usr
+ S.ToggleLight()
+
+/obj/screen/swarmer/ContactSwarmers
+ icon_state = "ui_contact_swarmers"
+ name = "Contact swarmers"
+ desc = "Sends a message to all other swarmers, should they exist."
+
+/obj/screen/swarmer/ContactSwarmers/Click()
+ if(isswarmer(usr))
+ var/mob/living/simple_animal/hostile/swarmer/S = usr
+ S.ContactSwarmers()
+
+/datum/hud/proc/swarmer_hud(ui_style = 'icons/mob/screen_midnight.dmi')
+ adding = list()
+
+ var/obj/screen/using
+
+ using = new /obj/screen/swarmer/FabricateTrap()
+ using.screen_loc = ui_rhand
+ adding += using
+
+ using = new /obj/screen/swarmer/Barricade()
+ using.screen_loc = ui_lhand
+ adding += using
+
+ using = new /obj/screen/swarmer/Replicate()
+ using.screen_loc = ui_zonesel
+ adding += using
+
+ using = new /obj/screen/swarmer/RepairSelf()
+ using.screen_loc = ui_storage1
+ adding += using
+
+ using = new /obj/screen/swarmer/ToggleLight()
+ using.screen_loc = ui_back
+ adding += using
+
+ using = new /obj/screen/swarmer/ContactSwarmers()
+ using.screen_loc = ui_inventory
+ adding += using
+
+ mymob.client.screen = list()
+ mymob.client.screen += mymob.client.void
+ mymob.client.screen += adding
+
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index a0f2e39fca2..00068884b21 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -16,6 +16,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
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
+ healable = 0
faction = list("cult")
flying = 1
unique_name = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index b1af5b5230e..a020baf05a9 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -16,6 +16,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
mob_size = MOB_SIZE_TINY
+ gold_core_spawnable = 2
/mob/living/simple_animal/butterfly/New()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 3268bd3007e..9c253d5d9c1 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -20,6 +20,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
+ gold_core_spawnable = 2
//RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/Runtime
@@ -31,6 +32,7 @@
gender = FEMALE
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
+ gold_core_spawnable = 0
/mob/living/simple_animal/pet/cat/Runtime/Life()
//MICE!
@@ -69,6 +71,7 @@
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
+ gold_core_spawnable = 0
/mob/living/simple_animal/pet/cat/kitten
name = "kitten"
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index ef3ce5448ad..7bf0522ab86 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -19,6 +19,7 @@
ventcrawler = 2
var/obj/item/inventory_head
var/obj/item/inventory_mask
+ gold_core_spawnable = 2
/mob/living/simple_animal/crab/Life()
..()
@@ -40,4 +41,5 @@
desc = "It's Coffee, the other pet!"
response_help = "pets"
response_disarm = "gently pushes aside"
- response_harm = "stomps"
\ No newline at end of file
+ response_harm = "stomps"
+ gold_core_spawnable = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 83766139bb4..9095888c40d 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -29,6 +29,7 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
+ gold_core_spawnable = 2
/mob/living/simple_animal/pet/dog/pug
name = "\improper pug"
@@ -39,6 +40,7 @@
icon_living = "pug"
icon_dead = "pug_dead"
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug = 3)
+ gold_core_spawnable = 2
/mob/living/simple_animal/pet/dog/corgi/New()
..()
@@ -390,6 +392,7 @@
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
+ gold_core_spawnable = 0
/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
..()
@@ -513,6 +516,7 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/puppies = 0
+ gold_core_spawnable = 0
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index 4b349ee1ddb..ac0bab34649 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -24,6 +24,7 @@
wander = 0
speed = 0
ventcrawler = 2
+ healable = 0
density = 0
pass_flags = PASSTABLE | PASSMOB
sight = (SEE_TURFS | SEE_OBJS)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index f1b449fb9bd..2a1a2e140e7 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -98,6 +98,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
health = 50
var/obj/udder/udder = null
+ gold_core_spawnable = 2
/mob/living/simple_animal/cow/New()
udder = new()
@@ -159,6 +160,7 @@
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
+ gold_core_spawnable = 2
/mob/living/simple_animal/chick/New()
..()
@@ -209,6 +211,7 @@ var/global/chicken_count = 0
var/list/feedMessages = list("It clucks happily.","It clucks happily.")
var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
var/list/validColors = list("brown","black","white")
+ gold_core_spawnable = 2
/mob/living/simple_animal/chicken/New()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index fefd67e907a..a6c4768344b 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -17,8 +17,10 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
+ gold_core_spawnable = 2
//Captain fox
/mob/living/simple_animal/pet/fox/Renault
name = "Renault"
- desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
\ No newline at end of file
+ desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
+ gold_core_spawnable = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index b03101df7f1..e958eea35e9 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -18,3 +18,4 @@
density = 0
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
+ gold_core_spawnable = 2
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 9b0bc3afd0c..fbe54636bcb 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -22,6 +22,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
var/body_color //brown, gray and white, leave blank for random
+ gold_core_spawnable = 2
/mob/living/simple_animal/mouse/New()
..()
@@ -77,6 +78,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
+ gold_core_spawnable = 0
/obj/item/trash/deadmouse
name = "dead mouse"
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 08ca902017d..56465782b39 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -29,6 +29,7 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
unique_name = 1
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/alien/drone
name = "alien drone"
@@ -130,6 +131,7 @@
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 10,
/obj/item/stack/sheet/animalhide/xeno = 2)
mob_size = MOB_SIZE_LARGE
+ gold_core_spawnable = 0
/obj/item/projectile/neurotox
name = "neurotoxin"
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 651d97dcb56..b091ed92d39 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -33,6 +33,7 @@
maxbodytemp = 1500
faction = list("russian")
+ gold_core_spawnable = 1
//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!!
/mob/living/simple_animal/hostile/bear/Hudson
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 5c9265578f8..7e1e6677337 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -21,6 +21,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_SMALL
flying = 1
+ gold_core_spawnable = 1
//Spaceborn beings don't get hurt by space
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)
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index dd872f00853..1fdef2619ff 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -31,6 +31,7 @@
faction = list("carp")
flying = 1
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
@@ -45,6 +46,7 @@
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
+ gold_core_spawnable = 0
/mob/living/simple_animal/hostile/carp/holocarp/death()
..(1)
diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm
index 173d8ff913f..66dc786c974 100644
--- a/code/modules/mob/living/simple_animal/hostile/creature.dm
+++ b/code/modules/mob/living/simple_animal/hostile/creature.dm
@@ -13,4 +13,4 @@
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
speak_emote = list("screams")
-
+ gold_core_spawnable = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index c74afd3be1b..a85c82a9cf9 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -26,6 +26,7 @@
minbodytemp = 0
faction = list("faithless")
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0)
return 1
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 9eb111c521e..a8a4cdc4357 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -45,6 +45,7 @@
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
unique_name = 1
+ gold_core_spawnable = 1
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/poison/giant_spider/nurse
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 587e686d67d..18160d68ad2 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -20,6 +20,7 @@
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index ce67552c952..ca434c387aa 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -11,6 +11,7 @@
icon_dead = "basic"
health = 15
maxHealth = 15
+ healable = 0
melee_damage_lower = 2
melee_damage_upper = 3
attacktext = "claws"
@@ -21,6 +22,7 @@
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
speak_emote = list("states")
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/hivebot/range
name = "hivebot"
diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
index 4677cb50cc9..5c032e21bc7 100644
--- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm
+++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
@@ -23,3 +23,4 @@
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
maxbodytemp = 500
+ gold_core_spawnable = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 5e0f67211e6..877739d8bd8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -26,6 +26,7 @@
faction = list("mimic")
move_to_delay = 9
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/mimic/death()
..(1)
@@ -109,6 +110,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
var/mob/living/creator = null // the creator
var/destroy_objects = 0
var/knockdown_people = 0
+ gold_core_spawnable = 0
/mob/living/simple_animal/hostile/mimic/copy/New(loc, obj/copy, mob/living/creator, destroy_original = 0)
..(loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index d06cd0672c7..052dc76c46a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -602,7 +602,7 @@
/obj/item/asteroid/fugu_gland/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag && istype(target, /mob/living/simple_animal))
var/mob/living/simple_animal/A = target
- if(A.buffed || A.type in banned_mobs || A.stat)
+ if(A.buffed || (A.type in banned_mobs) || A.stat)
user << "Something's interfering with the [src]'s effects. It's no use."
return
A.buffed++
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 8ff2d451a10..d5b8135442b 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -16,6 +16,7 @@
speed = -1
maxHealth = 50000
health = 50000
+ healable = 0
harm_intent_damage = 70
melee_damage_lower = 68
@@ -44,6 +45,7 @@
var/cannot_be_seen = 1
var/mob/living/creator = null
+ gold_core_spawnable = 1
// No movement while seen code.
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 38987cf6d27..f04ded89b18 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -132,8 +132,9 @@
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
mob_size = MOB_SIZE_TINY
- flying
+ flying = 1
speak_emote = list("states")
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/viscerator/death(gibbed)
..(gibbed)
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 0acc9aad7ef..fa43d85572e 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -33,6 +33,7 @@
faction = list("hostile")
var/drop_type = /obj/item/stack/sheet/mineral/wood
+ gold_core_spawnable = 1
/mob/living/simple_animal/hostile/tree/AttackingTarget()
..()
diff --git a/code/modules/mob/living/simple_animal/morph/morph.dm b/code/modules/mob/living/simple_animal/morph/morph.dm
index e543a67193c..b8d9d8e3230 100644
--- a/code/modules/mob/living/simple_animal/morph/morph.dm
+++ b/code/modules/mob/living/simple_animal/morph/morph.dm
@@ -20,6 +20,7 @@
minbodytemp = 0
maxHealth = 150
health = 150
+ healable = 0
environment_smash = 1
melee_damage_lower = 20
melee_damage_upper = 20
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 41c36669023..f600071a076 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -56,6 +56,7 @@
friendly = "grooms"
mob_size = MOB_SIZE_SMALL
flying = 1
+ gold_core_spawnable = 2
var/parrot_damage_upper = 10
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
@@ -809,6 +810,7 @@
name = "Poly"
desc = "Poly the Parrot. An expert on quantum cracker theory."
speak = list("Poly wanna cracker!", ":e Check the singlo, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS FREE CALL THE SHUTTLE")
+ gold_core_spawnable = 0
/mob/living/simple_animal/parrot/Poly/New()
ears = new /obj/item/device/radio/headset/headset_eng(src)
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm
index 22d6da50275..1bb8c995e60 100644
--- a/code/modules/mob/living/simple_animal/revenant/revenant.dm
+++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm
@@ -12,6 +12,7 @@
invisibility = INVISIBILITY_OBSERVER
health = 25
maxHealth = 25
+ healable = 0
see_invisible = SEE_INVISIBLE_OBSERVER
languages = ALL
response_help = "passes through"
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index cb43847c32c..a7fabaed8d2 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -7,6 +7,7 @@
icon_living = "shade"
maxHealth = 50
health = 50
+ healable = 0
speak_emote = list("hisses")
emote_hear = list("wails.","screeches.")
response_help = "puts their hand through"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 6a9927b9fc3..e783b47f745 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -34,6 +34,9 @@
var/minbodytemp = 250
var/maxbodytemp = 350
+ //Healable by medical stacks? Defaults to yes.
+ var/healable = 1
+
//Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
var/list/atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) //Leaving something at 0 means it's off - has no maximum
var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
@@ -41,6 +44,8 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
+ var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
+ var/list/ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 0, CLONE = 0, STAMINA = 1, OXY = 0) //Set 0 to receive that damage type, 1 to ignore
var/attacktext = "attacks"
var/attack_sound = null
var/friendly = "nuzzles" //If the mob does no damage with it's attack
@@ -58,6 +63,7 @@
var/flying = 0 //whether it's flying or touching the ground.
var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against
+ var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood
/mob/living/simple_animal/New()
..()
@@ -252,7 +258,7 @@
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- attack_threshold_check(damage)
+ attack_threshold_check(damage,M.melee_damage_type)
return 1
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
@@ -262,8 +268,21 @@
Proj.on_hit(src)
return 0
+/mob/living/simple_animal/adjustBruteLoss(amount)
+ if(!ignored_damage_types[BRUTE])
+ ..()
+
/mob/living/simple_animal/adjustFireLoss(amount)
- adjustBruteLoss(amount)
+ if(!ignored_damage_types[BURN])
+ adjustBruteLoss(amount)
+
+/mob/living/simple_animal/adjustToxLoss(amount)
+ if(!ignored_damage_types[TOX])
+ ..(amount)
+
+/mob/living/simple_animal/adjustCloneLoss(amount)
+ if(!ignored_damage_types[CLONE])
+ ..(amount)
/mob/living/simple_animal/adjustStaminaLoss(amount)
return
@@ -333,8 +352,8 @@
attack_threshold_check(damage)
return 1
-/mob/living/simple_animal/proc/attack_threshold_check(damage)
- if(damage <= force_threshold)
+/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE)
+ if(damage <= force_threshold || ignored_damage_types[damagetype])
visible_message("[src] looks unharmed.")
else
adjustBruteLoss(damage)
@@ -345,29 +364,6 @@
if(O.flags & NOBLUDGEON)
return
- if(istype(O, /obj/item/stack/medical))
- user.changeNext_move(CLICK_CD_MELEE)
- if(stat != DEAD)
- var/obj/item/stack/medical/MED = O
- if(health < maxHealth)
- if(MED.amount >= 1)
- if(MED.heal_brute >= 1)
- adjustBruteLoss(-MED.heal_brute)
- MED.amount -= 1
- if(MED.amount <= 0)
- qdel(MED)
- visible_message("[user] applies [MED] on [src].")
- return
- else
- user << "[MED] won't help at all."
- return
- else
- user << "[src] is at full health."
- return
- else
- user << "[src] is dead, medical items won't bring it back to life."
- return
-
if((butcher_results) && (stat == DEAD))
user.changeNext_move(CLICK_CD_MELEE)
var/sharpness = is_sharp(O)
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
index ff0c9866215..cae68cbd87b 100644
--- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -23,6 +23,7 @@
attacktext = "wildly tears into"
maxHealth = 200
health = 200
+ healable = 0
environment_smash = 1
melee_damage_lower = 30
melee_damage_upper = 30
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 6c2582fe005..045b5c31410 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -24,6 +24,7 @@
maxHealth = 150
health = 150
+ healable = 0
gender = NEUTER
nutrition = 700
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 857b7f35181..c53fa9b1d3a 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -125,6 +125,11 @@
return 1
return 0
+/proc/isswarmer(A)
+ if(istype(A, /mob/living/simple_animal/hostile/swarmer))
+ return 1
+ return 0
+
/proc/islimb(A)
if(istype(A, /obj/item/organ/limb))
return 1
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 4e380448a3f..02c9e1adfca 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -432,12 +432,15 @@ By design, d1 is the smallest direction and d2 is the highest
P.disconnect_from_network() //remove from current network (and delete powernet)
return
+ var/obj/O = P_list[1]
// remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
- var/datum/powernet/newPN = new()// creates a new powernet...
- propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable
+ spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
+ if(O && !qdeleted(O))
+ var/datum/powernet/newPN = new()// creates a new powernet...
+ propagate_network(O, newPN)//... and propagates it to the other side of the cable
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index a054fece023..ca08ffd7bc3 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -181,7 +181,8 @@
user << "Turn off \the [src] first!"
return
switch(state)
- if(0 && !isinspace())
+ if(0)
+ if(isinspace()) return
state = 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 550567bca53..8f2701a4246 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -100,7 +100,8 @@ field_generator power level display
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
- if(0 && !isinspace())
+ if(0)
+ if(isinspace()) return
state = 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 7a58c099077..e3a2d4cc612 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -4,10 +4,6 @@
#define REM REAGENTS_EFFECT_MULTIPLIER
-//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
-//so that it can continue working when the reagent is deleted while the proc is still active.
-
-
//Various reagents
//Toxin & acid reagents
//Hydroponics stuff
@@ -37,23 +33,18 @@
/datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(!istype(M))
return 0
- var/datum/reagent/self = src
- src = null
-
if(method == VAPOR) //smoke, foam, spray
if(M.reagents)
var/modifier = Clamp((1 - touch_protection), 0, 1)
var/amount = round(volume*modifier, 0.1)
if(amount >= 1)
- M.reagents.add_reagent(self.id, amount)
+ M.reagents.add_reagent(id, amount)
return 1
/datum/reagent/proc/reaction_obj(obj/O, volume)
- src = null
return
/datum/reagent/proc/reaction_turf(turf/T, volume)
- src = null
return
/datum/reagent/proc/on_mob_life(mob/living/M)
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
index 2b4630b4416..b951d205880 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
@@ -324,7 +324,6 @@
/datum/reagent/consumable/cornoil/reaction_turf(turf/simulated/T, reac_volume)
if (!istype(T))
return
- src = null
if(reac_volume >= 3)
T.MakeSlippery()
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
@@ -381,7 +380,6 @@
color = "#FFFFFF" // rgb: 0, 0, 0
/datum/reagent/consumable/flour/reaction_turf(turf/T, reac_volume)
- src = null
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/flour(T)
reagentdecal.reagents.add_reagent("flour", reac_volume)
diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm
index a8999d8ddac..14213840918 100644
--- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm
@@ -173,13 +173,36 @@
if(method == INGEST)
M.adjustToxLoss(0.5*reac_volume)
if(show_message)
- M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?"
+ M << "You probably shouldn't have eaten that. Maybe you should have splashed it on, or applied a patch?"
..()
/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/M)
M.adjustFireLoss(-2*REM)
..()
+/datum/reagent/medicine/oxandrolone
+ name = "Oxandrolone"
+ id = "oxandrolone"
+ description = "Stimulates healing of severe burns. If you have more than 50 burn damage, it heals 2 units; otherwise, 0.5. If overdosed it will exacerbate existing burns, causing burn and brute damage."
+ reagent_state = LIQUID
+ color = "#f7ffa5"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+
+/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/M)
+ if(M.getFireLoss() > 50)
+ M.adjustFireLoss(-2*REM)
+ else
+ M.adjustFireLoss(-0.5*REM)
+ ..()
+ return
+
+/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M)
+ M.adjustFireLoss(2.5*REM) // it's going to be healing either 2 or 0.5
+ M.adjustBruteLoss(0.5*REM)
+ ..()
+ return
+
/datum/reagent/medicine/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
index 76ce0b07ebe..f763cd1f201 100644
--- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
@@ -6,10 +6,8 @@
color = "#C80000" // rgb: 200, 0, 0
/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume)
- var/datum/reagent/blood/self = src
- src = null
- if(self.data && self.data["viruses"])
- for(var/datum/disease/D in self.data["viruses"])
+ if(data && data["viruses"])
+ for(var/datum/disease/D in data["viruses"])
if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
continue
@@ -28,7 +26,7 @@
src.data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning, or else we won't know who's even getting cloned, etc
if(src.data["viruses"] || data["viruses"])
- var/list/mix1 = src.data["viruses"]
+ var/list/mix1 = data["viruses"]
var/list/mix2 = data["viruses"]
// Stop issues with the list changing during mixing.
@@ -51,39 +49,36 @@
/datum/reagent/blood/reaction_turf(turf/simulated/T, reac_volume)//splash the blood all over the place
if(!istype(T))
return
- var/datum/reagent/blood/self = src
- src = null
if(reac_volume < 3)
return
- //var/datum/disease/D = self.data["virus"]
- if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
+ if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
- blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
+ blood_prop.blood_DNA[data["blood_DNA"]] = data["blood_type"]
- for(var/datum/disease/D in self.data["viruses"])
+ for(var/datum/disease/D in data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
- else if(istype(self.data["donor"], /mob/living/carbon/monkey))
+ else if(istype(data["donor"], /mob/living/carbon/monkey))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["Non-Human DNA"] = "A+"
- for(var/datum/disease/D in self.data["viruses"])
+ for(var/datum/disease/D in data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
- else if(istype(self.data["donor"], /mob/living/carbon/alien))
+ else if(istype(data["donor"], /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
- for(var/datum/disease/D in self.data["viruses"])
+ for(var/datum/disease/D in data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
@@ -96,13 +91,11 @@
color = "#C81040" // rgb: 200, 16, 64
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
- var/datum/reagent/vaccine/self = src
- src = null
- if(islist(self.data) && method == INGEST)
+ if(islist(data) && method == INGEST)
for(var/datum/disease/D in M.viruses)
- if(D.GetDiseaseID() in self.data)
+ if(D.GetDiseaseID() in data)
D.cure()
- M.resistances |= self.data
+ M.resistances |= data
/datum/reagent/vaccine/on_merge(list/data)
if(istype(data))
@@ -122,7 +115,6 @@
/datum/reagent/water/reaction_turf(turf/simulated/T, reac_volume)
if (!istype(T)) return
var/CT = cooling_temperature
- src = null
if(reac_volume >= 10)
T.MakeSlippery()
@@ -143,8 +135,6 @@
*/
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
- src = null
-
if(istype(O,/obj/item))
var/obj/item/Item = O
Item.extinguish()
@@ -250,7 +240,6 @@
/datum/reagent/lube/reaction_turf(turf/simulated/T, reac_volume)
if (!istype(T)) return
- src = null
if(reac_volume >= 1)
T.MakeSlippery(2)
@@ -384,7 +373,6 @@
color = "#13BC5E" // rgb: 19, 188, 94
/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
- src = null
if(method != TOUCH)
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
@@ -466,7 +454,6 @@
color = "#1C1300" // rgb: 30, 20, 0
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
- src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/dirt(T)
@@ -542,7 +529,6 @@
return
/datum/reagent/radium/reaction_turf(turf/T, reac_volume)
- src = null
if(reac_volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
@@ -587,7 +573,6 @@
..()
/datum/reagent/uranium/reaction_turf(turf/T, reac_volume)
- src = null
if(reac_volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
@@ -646,10 +631,6 @@
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(5,10))
- if(istype(T, /turf/simulated/floor))
- var/turf/simulated/floor/F = T
- if(reac_volume >= 1)
- F.dirt = 0
/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == TOUCH || VAPOR)
@@ -719,7 +700,6 @@
color = "#535E66" // rgb: 83, 94, 102
/datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
- src = null
if(method==PATCH || method==INGEST || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
M.ForceContractDisease(new /datum/disease/transformation/robot(0))
@@ -730,7 +710,6 @@
color = "#535E66" // rgb: 83, 94, 102
/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
- src = null
if(method==PATCH || method==INGEST || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
M.ContractDisease(new /datum/disease/transformation/xeno(0))
diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
index c56242773f6..b5cd4d00639 100644
--- a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
@@ -7,7 +7,6 @@
color = "#673910" // rgb: 103, 57, 16
/datum/reagent/thermite/reaction_turf(turf/T, reac_volume)
- src = null
if(reac_volume >= 1 && istype(T, /turf/simulated/wall))
var/turf/simulated/wall/Wall = T
if(istype(Wall, /turf/simulated/wall/r_wall))
diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
index e13de807739..fcdf66fa5b2 100644
--- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
@@ -33,7 +33,6 @@
return
if(!istype(M) || !M.dna)
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- src = null
if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method == PATCH)
randmuti(M)
if(prob(98))
@@ -66,12 +65,11 @@
return
/datum/reagent/toxin/plasma/reaction_obj(obj/O, reac_volume)
- src = null
- if((!O) || (!reac_volume)) return 0
+ if((!O) || (!reac_volume))
+ return 0
O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, reac_volume)
/datum/reagent/toxin/plasma/reaction_turf(turf/simulated/T, reac_volume)
- src = null
if(istype(T))
T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, reac_volume)
return
@@ -189,7 +187,6 @@
SV.on_chem_effect(src)
/datum/reagent/toxin/plantbgone/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
- src = null
if(method == VAPOR)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -212,7 +209,6 @@
toxpwr = 1
/datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
- src = null
if(method == VAPOR)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -639,7 +635,6 @@
/datum/reagent/toxin/acid/reaction_turf(turf/T, reac_volume)
if (!istype(T))
return
- src = null
reac_volume = round(reac_volume,0.1)
for(var/obj/O in T)
O.acid_act(acidpwr, reac_volume)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index eb27d64550c..51d3caf2b15 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -24,49 +24,15 @@
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
if(holder && holder.my_atom)
- var/blocked = list(/mob/living/simple_animal/hostile,
- /mob/living/simple_animal/hostile/pirate,
- /mob/living/simple_animal/hostile/pirate/ranged,
- /mob/living/simple_animal/hostile/russian,
- /mob/living/simple_animal/hostile/russian/ranged,
- /mob/living/simple_animal/hostile/syndicate,
- /mob/living/simple_animal/hostile/syndicate/melee,
- /mob/living/simple_animal/hostile/syndicate/melee/space,
- /mob/living/simple_animal/hostile/syndicate/ranged,
- /mob/living/simple_animal/hostile/syndicate/ranged/space,
- /mob/living/simple_animal/hostile/alien/queen/large,
- /mob/living/simple_animal/hostile/mushroom,
- /mob/living/simple_animal/hostile/asteroid,
- /mob/living/simple_animal/hostile/retaliate,
- /mob/living/simple_animal/hostile/asteroid/basilisk,
- /mob/living/simple_animal/hostile/asteroid/goldgrub,
- /mob/living/simple_animal/hostile/asteroid/goliath,
- /mob/living/simple_animal/hostile/asteroid/hivelord,
- /mob/living/simple_animal/hostile/asteroid/hivelordbrood,
- /mob/living/simple_animal/hostile/carp/holocarp,
- /mob/living/simple_animal/hostile/mining_drone,
- /mob/living/simple_animal/hostile/poison,
- /mob/living/simple_animal/hostile/blob,
- /mob/living/simple_animal/ascendant_shadowling,
- /mob/living/simple_animal/hostile/guardian,
- /mob/living/simple_animal/hostile/guardian/fire,
- /mob/living/simple_animal/hostile/guardian/punch,
- /mob/living/simple_animal/hostile/guardian/fast,
- /mob/living/simple_animal/hostile/guardian/healer,
- /mob/living/simple_animal/hostile/guardian/ranged,
- /mob/living/simple_animal/hostile/guardian/bluespace,
- /mob/living/simple_animal/hostile/guardian/bomb,
- /mob/living/simple_animal/hostile/guardian/shield
- )//exclusion list for things you don't want the reaction to create.
- var/list/meancritters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
- var/list/nicecritters = list(/mob/living/simple_animal/crab,
- /mob/living/simple_animal/mouse,
- /mob/living/simple_animal/lizard,
- /mob/living/simple_animal/parrot,
- /mob/living/simple_animal/butterfly,
- /mob/living/simple_animal/cow,
- /mob/living/simple_animal/chicken) // and possible friendly mobs
- nicecritters += typesof(/mob/living/simple_animal/pet) - /mob/living/simple_animal/pet
+ var/list/meancritters = list() // list of possible hostile mobs
+ var/list/nicecritters = list() // and possible friendly mobs
+ for(var/T in typesof(/mob/living/simple_animal))
+ var/mob/living/simple_animal/M = new T
+ switch(M.gold_core_spawnable)
+ if(1)
+ meancritters += M.type
+ if(2)
+ nicecritters += M.type
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
@@ -86,22 +52,17 @@
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
C.flash_eyes()
for(var/i = 1, i <= amount_to_spawn, i++)
+ var/chosen
if (reaction_name == "Friendly Gold Slime")
- var/chosen = pick(nicecritters)
- var/mob/living/simple_animal/C = new chosen
- C.faction |= mob_faction
- C.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
+ chosen = pick(nicecritters)
else
- var/chosen = pick(meancritters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= mob_faction
- C.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
+ chosen = pick(meancritters)
+ var/mob/living/simple_animal/C = new chosen
+ C.faction |= mob_faction
+ C.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
/datum/chemical_reaction/proc/goonchem_vortex(turf/simulated/T, setting_type, range)
for(var/atom/movable/X in orange(range, T))
diff --git a/code/modules/reagents/Chemistry-Recipes/Medicine.dm b/code/modules/reagents/Chemistry-Recipes/Medicine.dm
index 60e80923400..3ccc5753cc2 100644
--- a/code/modules/reagents/Chemistry-Recipes/Medicine.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Medicine.dm
@@ -116,6 +116,12 @@
required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 5
+/datum/chemical_reaction/oxandrolone
+ name = "Oxandrolone"
+ id = "oxandrolone"
+ result = "oxandrolone"
+ required_reagents = list("carbon" = 3, "phenol" = 1, "hydrogen" = 1, "oxygen" = 1)
+ result_amount = 6
/datum/chemical_reaction/salbutamol
name = "Salbutamol"
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 2a99e768c75..94ece6ee2c0 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -133,6 +133,12 @@
icon_state = "pill5"
list_reagents = list("sal_acid" = 24)
roundstart = 1
+/obj/item/weapon/reagent_containers/pill/oxandrolone
+ name = "oxandrolone pill"
+ desc = "Used to stimulate burn healing."
+ icon_state = "pill5"
+ list_reagents = list("oxandrolone" = 24)
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/insulin
name = "insulin pill"
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index e57a3762319..acb72b88205 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -703,7 +703,8 @@
R.realProc = realProc
R.revealed = TRUE
dupes |= R
- R.throw_at(pick(oview(7,get_turf(src))),10,1)
+ spawn()
+ R.throw_at(pick(oview(7,get_turf(src))),10,1)
counter = 0
spawn(rand(10,100))
for(counter = 1; counter <= dupes.len; counter++)
diff --git a/html/changelog.html b/html/changelog.html
index 74b09bfbaa3..821377b3ad1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,13 @@
-->
+
28 August 2015
+
bgobandit updated:
+
+ - Overheard at CentComm: 'This burn kit said salicyclic acid would heal my burns! WHO MADE THIS SHIT?' A muffled honking is heard in the background. (Burn first-aid kits now contain an appropriate burn pill.)
+ - Oxandrolone, a new burn healing medication, has been added to burn first-aid kits and to chemistry. Ingesting 25 units or more causes burn and brute damage.
+
+
19 August 2015
Joan updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index eac761cfbc9..b84356a720c 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1646,3 +1646,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscdel: Splashing someone with chemicals no longer injects those chemicals in
their body.
- bugfix: Fixes splashing acid on items or floor with items not having any effect.
+2015-08-28:
+ bgobandit:
+ - bugfix: 'Overheard at CentComm: ''This burn kit said salicyclic acid would heal
+ my burns! WHO MADE THIS SHIT?'' A muffled honking is heard in the background.
+ (Burn first-aid kits now contain an appropriate burn pill.)'
+ - rscadd: Oxandrolone, a new burn healing medication, has been added to burn first-aid
+ kits and to chemistry. Ingesting 25 units or more causes burn and brute damage.
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index d36bbaeda97..84cb19f814b 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 65366e873a4..248431514e1 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi
new file mode 100644
index 00000000000..96a9f9ae09e
Binary files /dev/null and b/icons/mob/swarmer.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 383abb503be..e89d43409bb 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1116,6 +1116,7 @@
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\death.dm"
#include "code\modules\mob\living\carbon\emote.dm"
+#include "code\modules\mob\living\carbon\examine.dm"
#include "code\modules\mob\living\carbon\inventory.dm"
#include "code\modules\mob\living\carbon\life.dm"
#include "code\modules\mob\living\carbon\say.dm"
@@ -1181,7 +1182,6 @@
#include "code\modules\mob\living\carbon\human\whisper.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
#include "code\modules\mob\living\carbon\monkey\emote.dm"
-#include "code\modules\mob\living\carbon\monkey\examine.dm"
#include "code\modules\mob\living\carbon\monkey\inventory.dm"
#include "code\modules\mob\living\carbon\monkey\life.dm"
#include "code\modules\mob\living\carbon\monkey\login.dm"
@@ -1229,6 +1229,7 @@
#include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
+#include "code\modules\mob\living\simple_animal\bot_swarm\swarmer.dm"
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
diff --git a/tools/mapmerge/dmm2tgm/Source/dmm2tgm.py b/tools/dmm2tgm/Source/dmm2tgm.py
similarity index 100%
rename from tools/mapmerge/dmm2tgm/Source/dmm2tgm.py
rename to tools/dmm2tgm/Source/dmm2tgm.py
diff --git a/tools/mapmerge/dmm2tgm/_hashlib.pyd b/tools/dmm2tgm/_hashlib.pyd
similarity index 100%
rename from tools/mapmerge/dmm2tgm/_hashlib.pyd
rename to tools/dmm2tgm/_hashlib.pyd
diff --git a/tools/mapmerge/dmm2tgm/bz2.pyd b/tools/dmm2tgm/bz2.pyd
similarity index 100%
rename from tools/mapmerge/dmm2tgm/bz2.pyd
rename to tools/dmm2tgm/bz2.pyd
diff --git a/tools/mapmerge/dmm2tgm/dmm2tgm.exe b/tools/dmm2tgm/dmm2tgm.exe
similarity index 100%
rename from tools/mapmerge/dmm2tgm/dmm2tgm.exe
rename to tools/dmm2tgm/dmm2tgm.exe
diff --git a/tools/mapmerge/dmm2tgm/library.zip b/tools/dmm2tgm/library.zip
similarity index 100%
rename from tools/mapmerge/dmm2tgm/library.zip
rename to tools/dmm2tgm/library.zip
diff --git a/tools/mapmerge/dmm2tgm/python27.dll b/tools/dmm2tgm/python27.dll
similarity index 100%
rename from tools/mapmerge/dmm2tgm/python27.dll
rename to tools/dmm2tgm/python27.dll
diff --git a/tools/mapmerge/dmm2tgm/select.pyd b/tools/dmm2tgm/select.pyd
similarity index 100%
rename from tools/mapmerge/dmm2tgm/select.pyd
rename to tools/dmm2tgm/select.pyd
diff --git a/tools/mapmerge/dmm2tgm/unicodedata.pyd b/tools/dmm2tgm/unicodedata.pyd
similarity index 100%
rename from tools/mapmerge/dmm2tgm/unicodedata.pyd
rename to tools/dmm2tgm/unicodedata.pyd
diff --git a/tools/mapmerge/dmm2tgm/w9xpopen.exe b/tools/dmm2tgm/w9xpopen.exe
similarity index 100%
rename from tools/mapmerge/dmm2tgm/w9xpopen.exe
rename to tools/dmm2tgm/w9xpopen.exe
diff --git a/tools/mapmerge/MapMerge.jar b/tools/mapmerge/MapMerge.jar
index c8e4349ba42..d0f0ce08028 100644
Binary files a/tools/mapmerge/MapMerge.jar and b/tools/mapmerge/MapMerge.jar differ
diff --git a/tools/mapmerge/Source/bin/MapMerge.class b/tools/mapmerge/Source/bin/MapMerge.class
index 9a6d17f143f..dff913a6b94 100644
Binary files a/tools/mapmerge/Source/bin/MapMerge.class and b/tools/mapmerge/Source/bin/MapMerge.class differ
diff --git a/tools/mapmerge/Source/src/MapMerge.java b/tools/mapmerge/Source/src/MapMerge.java
index a2058480a21..552a406b13d 100644
--- a/tools/mapmerge/Source/src/MapMerge.java
+++ b/tools/mapmerge/Source/src/MapMerge.java
@@ -88,7 +88,9 @@ public class MapMerge {
String to_save = selected_map;
String[] passInto = { "-clean", backup_map, edited_map, to_save };
MapPatcher.main(passInto);
- try{
+
+ // Will try to fix when I have time ~CorruptComputer
+ /*try{
Process process = new ProcessBuilder("dmm2tgm\\dmm2tgm.exe", selected_map).start();
}catch(Exception e1){
System.out.println("You are not on a windows machine, trying the .py");
@@ -99,6 +101,7 @@ public class MapMerge {
System.out.println("Downloads can be found here: https://www.python.org/downloads/");
}
}
+ */
}
}