mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 07:08:00 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into petemilking
Conflicts: code/modules/mob/living/simple_animal/friendly/farm_animals.dm
This commit is contained in:
@@ -77,4 +77,5 @@
|
||||
#define ALIEN 4
|
||||
#define ROBOT 8
|
||||
#define SLIME 16
|
||||
#define DRONE 32
|
||||
#define DRONE 32
|
||||
#define SWARMER 64
|
||||
@@ -342,4 +342,10 @@
|
||||
for(var/datum/D in L)
|
||||
if(D.vars.Find(varname))
|
||||
if(D.vars[varname] == value)
|
||||
return D
|
||||
return D
|
||||
|
||||
//remove all nulls from a list
|
||||
/proc/removeNullsFromList(list/L)
|
||||
while(L.Remove(null))
|
||||
continue
|
||||
return L
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
subsystems = master_controller.subsystems
|
||||
|
||||
@@ -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()
|
||||
/datum/subsystem/proc/Recover()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 << "<span class='notice'>Our genes cry out as we sting [target.name]!</span>"
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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 += "<span class='good'>Ready</span>"
|
||||
if(BOT_LOADING)
|
||||
dat += "<span class='good'>[mode_name[BOT_LOADING]]</span>"
|
||||
if(BOT_DELIVER)
|
||||
dat += "<span class='good'>[mode_name[BOT_DELIVER]]</span>"
|
||||
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 << "<span class='danger'>Access denied.</span>"
|
||||
return 0
|
||||
|
||||
/obj/machinery/bot/mulebot/proc/buzz(type)
|
||||
switch(type)
|
||||
if(SIGH)
|
||||
visible_message("[src] makes a sighing buzz.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
if(ANNOYED)
|
||||
visible_message("[src] makes an annoyed buzzing sound.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
if(DELIGHT)
|
||||
visible_message("[src] makes a delighted ping!", "<span class='italics'>You hear a ping.</span>")
|
||||
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.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
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.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
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.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
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!", "<span class='italics'>You hear a ping.</span>")
|
||||
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.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
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!", "<span class='italics'>You hear a ping.</span>")
|
||||
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
buzz(DELIGHT)
|
||||
|
||||
else
|
||||
visible_message("[src] makes a sighing buzz.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
|
||||
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 <b>[get_area(src)]</b>.", 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
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("<span class='danger'>[M] [M.attacktext] [src]!</span>")
|
||||
|
||||
@@ -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(\
|
||||
"<span class='warning'>[M.name] is buckled to [src] by [user.name]!</span>",\
|
||||
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
|
||||
"<span class='italics'>You heat metal clanking.</span>")
|
||||
"<span class='italics'>You hear metal clanking.</span>")
|
||||
|
||||
/obj/proc/user_unbuckle_mob(mob/user)
|
||||
var/mob/living/M = unbuckle_mob()
|
||||
|
||||
@@ -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 << "<span class='danger'>\The [M] is dead, you cannot help [t_him]!</span>"
|
||||
return
|
||||
|
||||
if(!istype(M))
|
||||
user << "<span class='danger'>You don't know how to apply \the [src] to [M]...</span>"
|
||||
if(!istype(M, /mob/living/carbon) && !istype(M, /mob/living/simple_animal))
|
||||
user << "<span class='danger'>You don't know how to apply \the [src] to [M]!</span>"
|
||||
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 << "<span class='notice'> You cannot use [src] on [M]!</span>"
|
||||
return
|
||||
else if (critter.health == critter.maxHealth)
|
||||
user << "<span class='notice'> [M] is at full health.</span>"
|
||||
return
|
||||
else if(src.heal_brute < 1)
|
||||
user << "<span class='notice'> [src] won't help [M] at all.</span>"
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [M].</span>", "<span class='green'>You apply [src] on [M].</span>")
|
||||
else
|
||||
var/t_himself = "itself"
|
||||
|
||||
@@ -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 << "<span class='warning'>[src] cuts into your hand!</span>"
|
||||
var/organ = (H.hand ? "l_" : "r_") + "arm"
|
||||
var/obj/item/organ/limb/affecting = H.get_organ(organ)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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("<span class='warning'>[M] smashes against [src].</span>", \
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
//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"
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -66,7 +66,6 @@
|
||||
color = "#aa77aa"
|
||||
icon_state = "vinefloor"
|
||||
broken_states = list()
|
||||
ignoredirt = 1
|
||||
|
||||
|
||||
//All of this shit is useless for vines
|
||||
|
||||
@@ -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 << "<span class='notice'>[xeno_name] begins climbing into the ventilation system...</span>"
|
||||
sleep(10)
|
||||
qdel(xeno)
|
||||
target << "<span class='notice'>[xeno_name] scrambles into the ventilation ducts!</span>"
|
||||
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 << "<span class='notice'>[xeno_name] begins climbing into the ventilation system...</span>"
|
||||
sleep(10)
|
||||
qdel(xeno)
|
||||
target << "<span class='notice'>[xeno_name] scrambles into the ventilation ducts!</span>"
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/hallucination/singularity_scare
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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].", \
|
||||
"<span class='notice'>You flip [src]. It lands on [coinflip].</span>", \
|
||||
"<span class='italics'>You hear the clattering of loose change.</span>")
|
||||
@@ -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"
|
||||
//---------------------------
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = "<span class='name'>[src]</span> hisses."
|
||||
m_type = 2
|
||||
|
||||
if ("me")
|
||||
..()
|
||||
return
|
||||
|
||||
if ("moan","moans")
|
||||
message = "<span class='name'>[src]</span> moans!"
|
||||
m_type = 2
|
||||
|
||||
@@ -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))
|
||||
..()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -50,4 +50,29 @@
|
||||
if(lying > 0)
|
||||
lying = 90 //Anything else looks retarded
|
||||
..()
|
||||
update_icons()
|
||||
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()
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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 = "<i><span class='game say'>Hivemind, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
|
||||
var/rendered = "<i><span class='alien'>Hivemind, <span class='name'>[shown_name]</span> <span class='message'>[message_a]</span></span></i>"
|
||||
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 = "<FONT size = 3>[shown_name]</FONT>"
|
||||
..(message, shown_name)
|
||||
|
||||
/mob/living/carbon/hivecheck()
|
||||
return getorgan(/obj/item/organ/internal/alien/hivenode)
|
||||
|
||||
@@ -187,7 +187,6 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
else
|
||||
target.visible_message("<span class='danger'>[src] violates [target]'s face!</span>", \
|
||||
"<span class='userdanger'>[src] violates [target]'s face!</span>")
|
||||
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("<span class='danger'>[src] curls up into a ball!</span>")
|
||||
|
||||
return
|
||||
|
||||
/proc/CanHug(mob/living/M)
|
||||
if(!istype(M))
|
||||
return 0
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -111,6 +111,11 @@
|
||||
else
|
||||
message = "<B>[src]</B> makes a noise."
|
||||
|
||||
if ("me")
|
||||
if(!silent)
|
||||
..()
|
||||
return
|
||||
|
||||
if ("nod","nods")
|
||||
message = "<B>[src]</B> nods."
|
||||
m_type = 1
|
||||
|
||||
+57
-44
@@ -1,45 +1,58 @@
|
||||
/mob/living/carbon/monkey/examine(mob/user)
|
||||
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\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 += "<span class='deadsay'>It is limp and unresponsive, with no signs of life.</span>\n"
|
||||
else
|
||||
msg += "<span class='warning'>"
|
||||
if (src.getBruteLoss())
|
||||
if (src.getBruteLoss() < 30)
|
||||
msg += "It has minor bruising.\n"
|
||||
else
|
||||
msg += "<B>It has severe bruising!</B>\n"
|
||||
if (src.getFireLoss())
|
||||
if (src.getFireLoss() < 30)
|
||||
msg += "It has minor burns.\n"
|
||||
else
|
||||
msg += "<B>It has severe burns!</B>\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 += "</span>"
|
||||
|
||||
if (src.digitalcamo)
|
||||
msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n"
|
||||
|
||||
msg += "*---------*</span>"
|
||||
|
||||
/mob/living/carbon/examine(mob/user)
|
||||
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\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 += "<span class='deadsay'>It is limp and unresponsive, with no signs of life.</span>\n"
|
||||
else
|
||||
msg += "<span class='warning'>"
|
||||
var/temp = getBruteLoss()
|
||||
if(temp)
|
||||
if (temp < 30)
|
||||
msg += "It has minor bruising.\n"
|
||||
else
|
||||
msg += "<B>It has severe bruising!</B>\n"
|
||||
|
||||
temp = getFireLoss()
|
||||
if(temp)
|
||||
if (temp < 30)
|
||||
msg += "It has minor burns.\n"
|
||||
else
|
||||
msg += "<B>It has severe burns!</B>\n"
|
||||
|
||||
temp = getCloneLoss()
|
||||
if(temp)
|
||||
if(getCloneLoss() < 30)
|
||||
msg += "It is slightly deformed.\n"
|
||||
else
|
||||
msg += "<b>It is severely deformed.</b>\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 += "</span>"
|
||||
|
||||
if (digitalcamo)
|
||||
msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n"
|
||||
|
||||
msg += "*---------*</span>"
|
||||
|
||||
user << msg
|
||||
@@ -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 << "<span class='notice'>You feel your heart beating again!</span>"
|
||||
|
||||
. = ..(shock_damage,source,siemens_coeff)
|
||||
. = ..(shock_damage,source,siemens_coeff,safety,override)
|
||||
if(.)
|
||||
electrocution_animation(40)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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 = "<B>[src]</B> gnarls and shows its teeth.."
|
||||
m_type = 2
|
||||
|
||||
if ("paw")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flails its paw."
|
||||
m_type = 1
|
||||
if ("me")
|
||||
..()
|
||||
return
|
||||
|
||||
if ("moan","moans")
|
||||
message = "<B>[src]</B> moans!"
|
||||
m_type = 2
|
||||
|
||||
if ("paw")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flails its paw."
|
||||
m_type = 1
|
||||
|
||||
if ("roar","roars")
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> 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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 << "<b>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.</b>"
|
||||
src << "<b>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 << "<b>Objectives:</b>"
|
||||
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 << "<span class='warning'>The volatile chemicals in this machine would destroy us. Aborting.</span>"
|
||||
|
||||
/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This device's destruction would result in the extermination of everything in the area. Aborting.</span>"
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Destroying this object would cause a chain reaction. Aborting.</span>"
|
||||
|
||||
/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>An inhospitable area may be created as a result of destroying this object. Aborting.</span>"
|
||||
|
||||
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
|
||||
|
||||
/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This bluespace source will be important to us later. Aborting.</span>"
|
||||
|
||||
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
if(locate(/turf/space) in range(1, src))
|
||||
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
if(locate(/turf/space) in range(1, src))
|
||||
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
|
||||
S << "<span class='warning'>This object does not contain enough materials to work with.</span>"
|
||||
|
||||
/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Attempting to dismantle this machine would result in an immediate counterattack. Aborting.</span>"
|
||||
|
||||
/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 << "<span class='warning'>This biological resource is somehow resisting our bluespace transceiver. Aborting.</span>"
|
||||
|
||||
|
||||
////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 << "<span class='warning'>This is not a suitable location for fabrication. We need more space.</span>"
|
||||
if(resources >= fabrication_cost)
|
||||
resources -= fabrication_cost
|
||||
else
|
||||
src << "<span class='warning'>You do not have the necessary resources to fabricate this object.</span>"
|
||||
return 0
|
||||
new fabrication_object(loc)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target)
|
||||
if(resources >= 100)
|
||||
src << "<span class='warning'>We cannot hold more materials!</span>"
|
||||
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 << "<span class='warning'>\the [target] is incompatible with our internal matter recycler.</span>"
|
||||
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 << "<span class='info'>Attempting to remove this being from our presence.</span>"
|
||||
if(src.z != ZLEVEL_STATION)
|
||||
src << "<span class='warning'>Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.</span>"
|
||||
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 << "<span class='info'>We begin to dismantle this machine. We will need to be uninterrupted.</span>"
|
||||
new /obj/effect/effect/sparks(get_turf(target))
|
||||
if(do_mob(src, target, 100))
|
||||
src << "<span class='info'>Dismantling complete.</span>"
|
||||
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 << "<span class='warning'>There is already a trap here. Aborting.</span>"
|
||||
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 << "<span class='warning'>There is already a blockade here. Aborting.</span>"
|
||||
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 << "<span class='info'>We are attempting to replicate ourselves. We will need to stand still until the process is complete.</span>"
|
||||
if(resources < 50)
|
||||
src << "<span class='warning'>We do not have the resources for this!</span>"
|
||||
return
|
||||
if(!isturf(loc))
|
||||
src << "<span class='warning'>This is not a suitable location for replicating ourselves. We need more room.</span>"
|
||||
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 << "<span class='info'>Attempting to repair damage to our body, stand by...</span>"
|
||||
if(do_mob(src, src, 100))
|
||||
adjustBruteLoss(-100)
|
||||
src << "<span class='info'>We successfully repaired ourselves.</span>"
|
||||
|
||||
/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 << "<B>Swarm communication - </b> [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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
response_harm = "stomps"
|
||||
gold_core_spawnable = 0
|
||||
@@ -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)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
wander = 0
|
||||
speed = 0
|
||||
ventcrawler = 2
|
||||
healable = 0
|
||||
density = 0
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
sight = (SEE_TURFS | SEE_OBJS)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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?"
|
||||
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
|
||||
gold_core_spawnable = 0
|
||||
@@ -18,3 +18,4 @@
|
||||
density = 0
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
gold_core_spawnable = 2
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -13,4 +13,4 @@
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
faction = list("creature")
|
||||
speak_emote = list("screams")
|
||||
|
||||
gold_core_spawnable = 1
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 << "<span class='warning'>Something's interfering with the [src]'s effects. It's no use.</span>"
|
||||
return
|
||||
A.buffed++
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
minbodytemp = 0
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
healable = 0
|
||||
environment_smash = 1
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
healable = 0
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
languages = ALL
|
||||
response_help = "passes through"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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("<span class='warning'>[src] looks unharmed.</span>")
|
||||
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("<span class='notice'>[user] applies [MED] on [src].</span>")
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>[MED] won't help at all.</span>"
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>[src] is at full health.</span>"
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>[src] is dead, medical items won't bring it back to life.</span>"
|
||||
return
|
||||
|
||||
if((butcher_results) && (stat == DEAD))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
var/sharpness = is_sharp(O)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
healable = 0
|
||||
gender = NEUTER
|
||||
|
||||
nutrition = 700
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -181,7 +181,8 @@
|
||||
user << "<span class='warning'>Turn off \the [src] first!</span>"
|
||||
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.", \
|
||||
|
||||
@@ -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.", \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -173,13 +173,36 @@
|
||||
if(method == INGEST)
|
||||
M.adjustToxLoss(0.5*reac_volume)
|
||||
if(show_message)
|
||||
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
|
||||
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should have splashed it on, or applied a patch?</span>"
|
||||
..()
|
||||
|
||||
/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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user