From 1c51550559b465d1a9dbc1c947662c0ab6ab0965 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sat, 8 Aug 2015 21:43:30 +0200 Subject: [PATCH 01/51] Changes how mulebots handle loading mobs. It now buckles them to the bot. You can no longer load objects containing mobs or with mobs buckled to them. You can no longer pass through plastic flaps by getting on a mulebot. Some simplification in mulebot code (buzzing sound code) Loading is now instantaneous and the mode BOT_LOADING is removed. The mulebot can no longer do certain stuff while off. Removing unneeded comments. Fixes mulebot loading/unloading being possible through border windows. Fixes mulebot not dropping its loaded cargo when qdel'd (wasn't a problem for explosion but for alien acid for example) --- code/game/machinery/bots/bots.dm | 15 +- code/game/machinery/bots/mulebot.dm | 219 ++++++++++++++++------------ code/game/objects/buckling.dm | 2 +- 3 files changed, 135 insertions(+), 101 deletions(-) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 9c6639c3bd7..c7d00e16013 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -70,17 +70,16 @@ #define BOT_MOVING 9 // for clean/floor/med bots, when moving. #define BOT_HEALING 10 // healing people (medbots) #define BOT_RESPONDING 11 // responding to a call from the AI - #define BOT_LOADING 12 // loading/unloading - #define BOT_DELIVER 13 // moving to deliver - #define BOT_GO_HOME 14 // returning to home - #define BOT_BLOCKED 15 // blocked - #define BOT_NAV 16 // computing navigation - #define BOT_WAIT_FOR_NAV 17 // waiting for nav computation - #define BOT_NO_ROUTE 18 // no destination beacon found (or no route) + #define BOT_DELIVER 12 // moving to deliver + #define BOT_GO_HOME 13 // returning to home + #define BOT_BLOCKED 14 // blocked + #define BOT_NAV 15 // computing navigation + #define BOT_WAIT_FOR_NAV 16 // waiting for nav computation + #define BOT_NO_ROUTE 17 // no destination beacon found (or no route) var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \ "Beginning Patrol", "Patrolling", "Summoned by PDA", \ "Cleaning", "Repairing", "Proceeding to work site", "Healing", \ - "Proceeding to AI waypoint", "Loading/Unloading", "Navigating to Delivery Location", "Navigating to Home", \ + "Proceeding to AI waypoint", "Navigating to Delivery Location", "Navigating to Home", \ "Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination") //This holds text for what the bot is mode doing, reported on the remote bot control interface. diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 68643c28cb6..d7ffb7b8405 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -6,6 +6,11 @@ var/global/mulebot_count = 0 + +#define SIGH 0 +#define ANNOYED 1 +#define DELIGHT 2 + /obj/machinery/bot/mulebot name = "\improper MULEbot" desc = "A Multiple Utility Load Effector bot." @@ -22,13 +27,15 @@ var/global/mulebot_count = 0 bot_type = MULE_BOT model = "MULE" blood_DNA = list() + can_buckle = 1 + buckle_lying = 0 suffix = "" var/turf/target // this is turf to navigate to (location of beacon) var/loaddir = 0 // this the direction to unload onto/load from var/home_destination = "" // tag of home beacon - req_access = list(access_cargo) + req_access = list(access_cargo) mode = BOT_IDLE @@ -77,6 +84,28 @@ obj/machinery/bot/mulebot/bot_reset() reached_target = 0 +obj/machinery/bot/mulebot/Move(atom/newloc, direct) + . = ..() + if(buckled_mob) + buckled_mob.buckled = null + 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 + buckled_mob.buckled = src + +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 +212,6 @@ obj/machinery/bot/mulebot/bot_reset() switch(mode) if(BOT_IDLE) dat += "Ready" - if(BOT_LOADING) - dat += "[mode_name[BOT_LOADING]]" if(BOT_DELIVER) dat += "[mode_name[BOT_DELIVER]]" if(BOT_GO_HOME) @@ -358,7 +385,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 +406,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 +419,93 @@ obj/machinery/bot/mulebot/bot_reset() user << "Access denied." return 0 +/obj/machinery/bot/mulebot/proc/buzz(type) + switch(type) + if(SIGH) + visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") + playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + if(ANNOYED) + visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") + playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + if(DELIGHT) + visible_message("[src] makes a delighted ping!", "You hear a ping.") + playsound(loc, 'sound/machines/ping.ogg', 50, 0) + + // mousedrop a crate to load the bot // can load anything if emagged +/obj/machinery/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user) -/obj/machinery/bot/mulebot/MouseDrop_T(atom/movable/C, mob/user) - - if(user.stat) + if(user.incapacitated() || user.lying) return - if (!on || !istype(C)|| C.anchored || get_dist(user, src) > 1 || get_dist(src,C) > 1 ) + if (!istype(AM)) return - if(load) - return - - load(C) - + load(AM) // called to load a crate -/obj/machinery/bot/mulebot/proc/load(atom/movable/C) - if(wires.LoadCheck() && !istype(C,/obj/structure/closet/crate)) - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - return // if not emagged, only allow crates to be loaded - - //I'm sure someone will come along and ask why this is here... well people were dragging screen items onto the mule, and that was not cool. - //So this is a simple fix that only allows a selection of item types to be considered. Further narrowing-down is below. - if(!istype(C,/obj/item) && !istype(C,/obj/machinery) && !istype(C,/obj/structure) && !ismob(C)) - return - if(!isturf(C.loc)) //To prevent the loading from stuff from someone's inventory, which wouldn't get handled properly. +/obj/machinery/bot/mulebot/proc/load(atom/movable/AM) + if(load || AM.anchored) return - if(get_dist(C, src) > 1 || load || !on) + if(!isturf(AM.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. return - mode = BOT_LOADING - // if a create, close before loading - var/obj/structure/closet/crate/crate = C - if(istype(crate)) - crate.close() + var/obj/structure/closet/crate/CRATE + if(istype(AM,/obj/structure/closet/crate)) + CRATE = AM + else + if(wires.LoadCheck()) + buzz(SIGH) + return // if not emagged, only allow crates to be loaded - C.loc = loc - sleep(2) - if(C.loc != loc) //To prevent you from going onto more thano ne bot. - return - C.loc = src - load = C + if(CRATE) // if it's a crate, close before loading + CRATE.close() - C.pixel_y += 9 - if(C.layer < layer) - C.layer = layer + 0.1 - overlays += C + if(isobj(AM)) + var/obj/O = AM + if(O.buckled_mob || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it. + buzz(SIGH) + return - if(ismob(C)) - var/mob/M = C - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src + if(isliving(AM)) + if(!buckle_mob(AM)) + return + else + AM.loc = src + AM.pixel_y += 9 + if(AM.layer < layer) + AM.layer = layer + 0.1 + overlays += AM + load= AM mode = BOT_IDLE +/obj/machinery/bot/mulebot/buckle_mob(mob/living/M) + if(M.buckled) + return 0 + var/turf/T = get_turf(src) + 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 +513,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 +532,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 +572,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 +639,22 @@ obj/machinery/bot/mulebot/bot_reset() blockcount++ mode = BOT_BLOCKED if(blockcount == 3) - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + buzz(ANNOYED) if(blockcount > 10) // attempt 10 times before recomputing // find new path excluding blocked turf - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + buzz(SIGH) spawn(2) calc_path(next) if(path.len > 0) - visible_message("[src] makes a delighted ping!", "You hear a ping.") - playsound(loc, 'sound/machines/ping.ogg', 50, 0) + buzz(DELIGHT) mode = BOT_BLOCKED mode = BOT_WAIT_FOR_NAV return return else - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + buzz(ANNOYED) //world << "Bad turf." mode = BOT_NAV return @@ -641,20 +673,12 @@ obj/machinery/bot/mulebot/bot_reset() if(path.len > 0) blockcount = 0 mode = BOT_BLOCKED - visible_message("[src] makes a delighted ping!", "You hear a ping.") - playsound(loc, 'sound/machines/ping.ogg', 50, 0) + buzz(DELIGHT) else - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + buzz(SIGH) mode = BOT_NO_ROUTE - //if(6) - //world << "Pending path calc." - //if(7) - //world << "No dest / no route." - - return // calculates a path to the current destination @@ -673,6 +697,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 +709,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 +747,7 @@ obj/machinery/bot/mulebot/bot_reset() break else // otherwise, look for crates only AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir) - if(AM) + if(AM && AM.Adjacent(src)) load(AM) if(report_delivery) speak("Now loading [load] at [get_area(src)].", radio_frequency) @@ -828,5 +856,12 @@ obj/machinery/bot/mulebot/bot_reset() s.start() new /obj/effect/decal/cleanable/oil(loc) - unload(0) qdel(src) + +/obj/machinery/bot/mulebot/Destroy() + unload(0) + return ..() + +#undef SIGH +#undef ANNOYED +#undef DELIGHT \ No newline at end of file diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 0c781f27f9b..21fca6593d0 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -72,7 +72,7 @@ //Wrapper procs that handle sanity and user feedback /obj/proc/user_buckle_mob(mob/living/M, mob/user) - if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat) + if(!user.Adjacent(M) || user.lying || user.incapacitated()) return add_fingerprint(user) From e16c03f01023a17bda9d166723f473e83ddc0130 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sat, 8 Aug 2015 22:10:25 +0200 Subject: [PATCH 02/51] woops, now buckling succeeds if you are on the mulebot's turf. --- code/game/machinery/bots/mulebot.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index d7ffb7b8405..fca41d8291e 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -486,11 +486,12 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5) if(M.buckled) return 0 var/turf/T = get_turf(src) - density = 0 - var/can_step = step_towards(M, T) - density = 1 - if(!can_step) - return 0 + if(M.loc != T) + density = 0 + var/can_step = step_towards(M, T) + density = 1 + if(!can_step) + return 0 return ..() @@ -802,11 +803,10 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5) // 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... From 831c069404d16d29ec440418514e2c32fccfd9e3 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 11 Aug 2015 22:19:07 -0700 Subject: [PATCH 03/51] Smooth out gliding so movement isn't (as) jerky Only applies to non-ghost, non-camera mob movement. Scales automatically to any fps and any move delay. Also took this oppurtunity to remove tickcomp because it was USELESS and shit. All the rounding is because of floating point imprecision. round(2.7, 0.9) != 2.7, for example. 2.7 + world.time would wind up being < than world.time 3 ticks later even though they should be equal. --- code/controllers/configuration.dm | 3 --- code/modules/admin/verbs/fps.dm | 6 +---- code/modules/mob/mob_movement.dm | 42 ++++++++++++++++++------------- config/config.txt | 3 --- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c8670e39a3d..947e157b68d 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -37,7 +37,6 @@ var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/fps = 10 - var/Tickcomp = 0 var/allow_holidays = 0 //toggles whether holiday-specific content should be used var/hostedby = null @@ -308,8 +307,6 @@ fps = 10 / ticklag if("fps") fps = text2num(value) - if("tickcomp") - Tickcomp = 1 if("automute_on") automute_on = 1 if("comms_key") diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm index b243d3d2259..7e49860b1c9 100644 --- a/code/modules/admin/verbs/fps.dm +++ b/code/modules/admin/verbs/fps.dm @@ -15,11 +15,7 @@ if(alert(src, "You are setting fps to a high value:\n\t[fps] frames-per-second\n\tconfig.fps = [config.fps]","Warning!","Confirm","ABORT-ABORT-ABORT") != "Confirm") return - switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Enable","Disable")) - if("Enable") config.Tickcomp = 1 - else config.Tickcomp = 0 - - var/msg = "[key_name(src)] has modified world.fps to [fps] and config.Tickcomp to [config.Tickcomp]" + var/msg = "[key_name(src)] has modified world.fps to [fps]" log_admin(msg, 0) message_admins(msg, 0) feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d65438f65e7..35b7549a45f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -136,12 +136,6 @@ if(isturf(mob.loc)) - - var/turf/T = mob.loc - move_delay = world.time//set move delay - - move_delay += T.slowdown - if(mob.restrained()) //Why being pulled while cuffed prevents you from moving for(var/mob/M in range(mob, 1)) if(M.pulling == mob) @@ -152,6 +146,13 @@ else M.stop_pulling() + //We are now going to move + moving = 1 + move_delay = 0 + + var/turf/T = mob.loc + move_delay += T.slowdown + switch(mob.m_intent) if("run") if(mob.drowsyness > 0) @@ -159,18 +160,12 @@ move_delay += config.run_speed if("walk") move_delay += config.walk_speed + move_delay += mob.movement_delay() - if(config.Tickcomp) - move_delay -= 1.3 - var/tickcomp = (1 / (world.tick_lag)) * 1.3 - move_delay = move_delay + tickcomp - - //We are now going to move - moving = 1 - //Something with pulling things + //Something with pulling things //This really needs to be redone by someone, NOT ME THOUGH HA HA! if(locate(/obj/item/weapon/grab, mob)) - move_delay = max(move_delay, world.time + 7) + move_delay = max(move_delay, 7) var/list/L = mob.ret_grab() if(istype(L, /list)) if(L.len == 2) @@ -200,6 +195,21 @@ M.animate_movement = 2 return + + var/san_tick_lag = round(world.tick_lag, 0.1) //floating point imprecision means 0.9 != 0.9 + var/rounded = round(move_delay, san_tick_lag) //Round move_delay up to the nearest multiple of tick_lag + if(rounded < move_delay) + rounded += san_tick_lag + move_delay = rounded + + if(move_delay <= 0) + glide_size = 0 + else + glide_size = world.icon_size / move_delay * san_tick_lag //assume icons are square + mob.glide_size = glide_size + + move_delay += (world.time - 0.01) //Floating point imprecision again + if(mob.confused && IsEven(world.time)) step(mob, pick(cardinal)) else @@ -209,8 +219,6 @@ if(mob && .) mob.throwing = 0 - return . - ///Process_Grab() ///Called by client/Move() diff --git a/config/config.txt b/config/config.txt index c40c7cc783f..c9392c7715e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -145,9 +145,6 @@ ALLOW_HOLIDAYS ##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. TICKLAG 0.9 -## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. -TICKCOMP 0 - ## Comment this out to disable automuting #AUTOMUTE_ON From b130f4958d98a6f37f96d2c21093dc678deccb1d Mon Sep 17 00:00:00 2001 From: MrPerson Date: Sat, 15 Aug 2015 22:28:42 -0700 Subject: [PATCH 04/51] Simplify the math a bit on gliding Rounding now happens after calculations instead of before. The delay is also unrounded. --- code/modules/mob/mob_movement.dm | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 35b7549a45f..e7eee30eb35 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -195,20 +195,13 @@ M.animate_movement = 2 return - - var/san_tick_lag = round(world.tick_lag, 0.1) //floating point imprecision means 0.9 != 0.9 - var/rounded = round(move_delay, san_tick_lag) //Round move_delay up to the nearest multiple of tick_lag - if(rounded < move_delay) - rounded += san_tick_lag - move_delay = rounded - - if(move_delay <= 0) - glide_size = 0 - else - glide_size = world.icon_size / move_delay * san_tick_lag //assume icons are square + var/ticks = Ceiling(move_delay / world.tick_lag) + if(ticks <= 0) + ticks = 1 + glide_size = world.icon_size / ticks //assume icons are square mob.glide_size = glide_size - move_delay += (world.time - 0.01) //Floating point imprecision again + move_delay += world.time - 0.0001 //Ensure we're on the right tick even if there's rounding errors if(mob.confused && IsEven(world.time)) step(mob, pick(cardinal)) From 51a17eeeac6fbda5022bbfb15b2a11becdc4f726 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 18 Aug 2015 21:54:53 -0700 Subject: [PATCH 05/51] Per MSO's advice, Ceiling glide_size until BYOND supports floats --- code/modules/mob/mob_movement.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index e7eee30eb35..6e2aac8909e 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -198,8 +198,16 @@ var/ticks = Ceiling(move_delay / world.tick_lag) if(ticks <= 0) ticks = 1 - glide_size = world.icon_size / ticks //assume icons are square - mob.glide_size = glide_size + var/target_glide_size = world.icon_size / ticks + + glide_size = target_glide_size + mob.glide_size = target_glide_size + + //byond floor()'s glide_size, we want it to Ceiling(), + //but we don't want it to Ceiling() if they fix it to accept floating point numbers + if(glide_size != target_glide_size) + glide_size = Ceiling(target_glide_size) + mob.glide_size = glide_size move_delay += world.time - 0.0001 //Ensure we're on the right tick even if there's rounding errors From 94344cd4712237ad28fa4c0a8fa643c2a4fc9b29 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Wed, 19 Aug 2015 21:10:36 +1000 Subject: [PATCH 06/51] changes gold slime core hostile mob list to whitelist --- .../living/simple_animal/hostile/syndicate.dm | 2 +- code/modules/reagents/Chemistry-Recipes.dm | 79 +++++++++---------- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 38987cf6d27..9e6358e8a21 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -132,7 +132,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 mob_size = MOB_SIZE_TINY - flying + flying = 1 speak_emote = list("states") /mob/living/simple_animal/hostile/viscerator/death(gibbed) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index eb27d64550c..610522c91df 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -24,48 +24,45 @@ /datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon") if(holder && holder.my_atom) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/goldgrub, - /mob/living/simple_animal/hostile/asteroid/goliath, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/carp/holocarp, - /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/poison, - /mob/living/simple_animal/hostile/blob, - /mob/living/simple_animal/ascendant_shadowling, - /mob/living/simple_animal/hostile/guardian, - /mob/living/simple_animal/hostile/guardian/fire, - /mob/living/simple_animal/hostile/guardian/punch, - /mob/living/simple_animal/hostile/guardian/fast, - /mob/living/simple_animal/hostile/guardian/healer, - /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/bluespace, - /mob/living/simple_animal/hostile/guardian/bomb, - /mob/living/simple_animal/hostile/guardian/shield - )//exclusion list for things you don't want the reaction to create. - var/list/meancritters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + var/list/meancritters = list(/mob/living/simple_animal/hostile/blob/blobspore, // list of possible hostile mobs + /mob/living/simple_animal/hostile/blob/blobbernaut, + /mob/living/simple_animal/hostile/carp/ranged/chaos, + /mob/living/simple_animal/hostile/carp/ranged, + /mob/living/simple_animal/hostile/carp/megacarp, + /mob/living/simple_animal/hostile/carp/eyeball, + /mob/living/simple_animal/hostile/carp, + /mob/living/simple_animal/hostile/alien/drone, + /mob/living/simple_animal/hostile/alien/sentinel, + /mob/living/simple_animal/hostile/alien/queen, + /mob/living/simple_animal/hostile/alien, + /mob/living/simple_animal/hostile/bear/Hudson, + /mob/living/simple_animal/hostile/bear, + /mob/living/simple_animal/hostile/poison/bees, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter, + /mob/living/simple_animal/hostile/poison/giant_spider, + /mob/living/simple_animal/hostile/creature, + /mob/living/simple_animal/hostile/faithless, + /mob/living/simple_animal/hostile/headcrab, + /mob/living/simple_animal/hostile/hivebot/range, + /mob/living/simple_animal/hostile/hivebot/rapid, + /mob/living/simple_animal/hostile/hivebot/strong, + /mob/living/simple_animal/hostile/hivebot, + /mob/living/simple_animal/hostile/killertomato, + /mob/living/simple_animal/hostile/mimic/crate, + /mob/living/simple_animal/hostile/mimic, + /mob/living/simple_animal/hostile/statue, + /mob/living/simple_animal/hostile/viscerator, + /mob/living/simple_animal/hostile/tree/festivus, + /mob/living/simple_animal/hostile/tree) + var/list/nicecritters = list(/mob/living/simple_animal/crab, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/lizard, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/chicken) // and possible friendly mobs + /mob/living/simple_animal/mouse, + /mob/living/simple_animal/lizard, + /mob/living/simple_animal/parrot, + /mob/living/simple_animal/butterfly, + /mob/living/simple_animal/cow, + /mob/living/simple_animal/chicken) // and possible friendly mobs nicecritters += typesof(/mob/living/simple_animal/pet) - /mob/living/simple_animal/pet var/atom/A = holder.my_atom var/turf/T = get_turf(A) From d27a736f7e72506c34b36dc6fcf8b3acb2d4cc57 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Fri, 21 Aug 2015 16:57:27 -0500 Subject: [PATCH 07/51] Fixes #11301 --- .../{mapmerge => }/dmm2tgm/Source/dmm2tgm.py | 0 tools/{mapmerge => }/dmm2tgm/_hashlib.pyd | Bin tools/{mapmerge => }/dmm2tgm/bz2.pyd | Bin tools/{mapmerge => }/dmm2tgm/dmm2tgm.exe | Bin tools/{mapmerge => }/dmm2tgm/library.zip | Bin tools/{mapmerge => }/dmm2tgm/python27.dll | Bin tools/{mapmerge => }/dmm2tgm/select.pyd | Bin tools/{mapmerge => }/dmm2tgm/unicodedata.pyd | Bin tools/{mapmerge => }/dmm2tgm/w9xpopen.exe | Bin tools/mapmerge/MapMerge.jar | Bin 20893 -> 20574 bytes tools/mapmerge/Source/bin/MapMerge.class | Bin 4059 -> 3519 bytes tools/mapmerge/Source/src/MapMerge.java | 5 ++++- 12 files changed, 4 insertions(+), 1 deletion(-) rename tools/{mapmerge => }/dmm2tgm/Source/dmm2tgm.py (100%) rename tools/{mapmerge => }/dmm2tgm/_hashlib.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/bz2.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/dmm2tgm.exe (100%) rename tools/{mapmerge => }/dmm2tgm/library.zip (100%) rename tools/{mapmerge => }/dmm2tgm/python27.dll (100%) rename tools/{mapmerge => }/dmm2tgm/select.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/unicodedata.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/w9xpopen.exe (100%) diff --git a/tools/mapmerge/dmm2tgm/Source/dmm2tgm.py b/tools/dmm2tgm/Source/dmm2tgm.py similarity index 100% rename from tools/mapmerge/dmm2tgm/Source/dmm2tgm.py rename to tools/dmm2tgm/Source/dmm2tgm.py diff --git a/tools/mapmerge/dmm2tgm/_hashlib.pyd b/tools/dmm2tgm/_hashlib.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/_hashlib.pyd rename to tools/dmm2tgm/_hashlib.pyd diff --git a/tools/mapmerge/dmm2tgm/bz2.pyd b/tools/dmm2tgm/bz2.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/bz2.pyd rename to tools/dmm2tgm/bz2.pyd diff --git a/tools/mapmerge/dmm2tgm/dmm2tgm.exe b/tools/dmm2tgm/dmm2tgm.exe similarity index 100% rename from tools/mapmerge/dmm2tgm/dmm2tgm.exe rename to tools/dmm2tgm/dmm2tgm.exe diff --git a/tools/mapmerge/dmm2tgm/library.zip b/tools/dmm2tgm/library.zip similarity index 100% rename from tools/mapmerge/dmm2tgm/library.zip rename to tools/dmm2tgm/library.zip diff --git a/tools/mapmerge/dmm2tgm/python27.dll b/tools/dmm2tgm/python27.dll similarity index 100% rename from tools/mapmerge/dmm2tgm/python27.dll rename to tools/dmm2tgm/python27.dll diff --git a/tools/mapmerge/dmm2tgm/select.pyd b/tools/dmm2tgm/select.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/select.pyd rename to tools/dmm2tgm/select.pyd diff --git a/tools/mapmerge/dmm2tgm/unicodedata.pyd b/tools/dmm2tgm/unicodedata.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/unicodedata.pyd rename to tools/dmm2tgm/unicodedata.pyd diff --git a/tools/mapmerge/dmm2tgm/w9xpopen.exe b/tools/dmm2tgm/w9xpopen.exe similarity index 100% rename from tools/mapmerge/dmm2tgm/w9xpopen.exe rename to tools/dmm2tgm/w9xpopen.exe diff --git a/tools/mapmerge/MapMerge.jar b/tools/mapmerge/MapMerge.jar index c8e4349ba4256824d9c5a6f9cb1ba1029be6cb56..d0f0ce08028cdbb917fe185b48e331f8433d49c5 100644 GIT binary patch delta 2308 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 U1x@$?2ryQ~7e z0(yRcf-k{XgmFSKqch8$xnIe99DMxdZ@?liS>Sqh&F}U;{aq8790wm{+pdILBDNd; zOq`nj^hIAX6*x?3KBHkx)akUO%^|UN&WS1!2drw(V++f%gmrSRI zHVfP;jqu76y#ak|cSu%$RSHLHEOR%YlqUB|t~5#acu*Xbc@iF##$+9rC-(6;QX8Qf n7@9iP>O^CX+IUhjE2UnoA}y#lN@9r$W=f0{?5OHlcMbU;b{0Ix delta 847 zcmZvZT~8B16o%ikZRvJf6>BgeDnkf@!L*7d#9}lWy&=S)B$x(7m+sJ3+g;dhDK#;@ z@s4OrdSmd$cvBOD3MeQDh~MJZ5Ac_W4LDn>!DzCx=bbt4Ip^8g#hUN6%JS;$0)WH# zHleuWoEr}bJ1(okYA~Vd(O{=(M0hH7G96E7+?4T{uuV%QTdZiZw;Tg}gew@wqz~Is zXR9YZJjFD@m9kXRB2+c)>-eW-n~Z0K17Rc0RFgB^u$ZCen94G7T{AK%mQ*9LxX$-8 z%go00D6?Xm1qQP+W(n258M=(L8R36W?DPvlquo_AN=;+xFlU2VD`x1dCD0leVR2n> zB@$c<$XFm8J7r|_grRCF7CEHqte>+1Bdu#J#!Vh#G0PfEg@VCMCL^ZXZ32cF4GP5d zqF{cDd_$J_L4w3vrpDxplH$073U~p!pLclA(E0p1@6X&E#>1|8G=v@gM_plOwX1fiY!%F2&wEa4R-bWjgoi>!pR2;z-U4$R{S-j>u46v`?uV3u;C#7Ucw$GeiM z$2Ghc%0-RH;)75X)QmJf3gxEL=)p1uAPeADe8LrY1a2ih3#A|-(0l@F9W*I+x>yD( zy|qQ`p`sXMulg1E>x!tM%`4d5TNKx{h9o?0oFF1M8a6xz#6kBO_Con@S|rPkt#Fha N5T8x>BIZi?`U~%)*#iIo diff --git a/tools/mapmerge/Source/src/MapMerge.java b/tools/mapmerge/Source/src/MapMerge.java index a2058480a21..552a406b13d 100644 --- a/tools/mapmerge/Source/src/MapMerge.java +++ b/tools/mapmerge/Source/src/MapMerge.java @@ -88,7 +88,9 @@ public class MapMerge { String to_save = selected_map; String[] passInto = { "-clean", backup_map, edited_map, to_save }; MapPatcher.main(passInto); - try{ + + // Will try to fix when I have time ~CorruptComputer + /*try{ Process process = new ProcessBuilder("dmm2tgm\\dmm2tgm.exe", selected_map).start(); }catch(Exception e1){ System.out.println("You are not on a windows machine, trying the .py"); @@ -99,6 +101,7 @@ public class MapMerge { System.out.println("Downloads can be found here: https://www.python.org/downloads/"); } } + */ } } From 5824fedc175135ec40302d965b833f7223b08b01 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Sat, 22 Aug 2015 16:49:13 +1000 Subject: [PATCH 08/51] gold core spawnable as var --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 3 +- .../simple_animal/friendly/butterfly.dm | 1 + .../mob/living/simple_animal/friendly/cat.dm | 3 + .../mob/living/simple_animal/friendly/crab.dm | 4 +- .../mob/living/simple_animal/friendly/dog.dm | 4 ++ .../simple_animal/friendly/farm_animals.dm | 3 + .../mob/living/simple_animal/friendly/fox.dm | 4 +- .../living/simple_animal/friendly/lizard.dm | 1 + .../living/simple_animal/friendly/mouse.dm | 2 + .../mob/living/simple_animal/hostile/alien.dm | 2 + .../mob/living/simple_animal/hostile/bear.dm | 1 + .../mob/living/simple_animal/hostile/bees.dm | 1 + .../mob/living/simple_animal/hostile/carp.dm | 2 + .../living/simple_animal/hostile/creature.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 1 + .../simple_animal/hostile/giant_spider.dm | 1 + .../living/simple_animal/hostile/headcrab.dm | 1 + .../living/simple_animal/hostile/hivebot.dm | 1 + .../simple_animal/hostile/killertomato.dm | 1 + .../mob/living/simple_animal/hostile/mimic.dm | 2 + .../living/simple_animal/hostile/statue.dm | 1 + .../living/simple_animal/hostile/syndicate.dm | 1 + .../mob/living/simple_animal/hostile/tree.dm | 1 + .../mob/living/simple_animal/parrot.dm | 2 + .../mob/living/simple_animal/simple_animal.dm | 2 + code/modules/reagents/Chemistry-Recipes.dm | 72 +++++-------------- 26 files changed, 61 insertions(+), 58 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 440967945ab..cad8505781d 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -39,6 +39,7 @@ var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() @@ -161,7 +162,7 @@ force_threshold = 10 environment_smash = 3 mob_size = MOB_SIZE_LARGE - + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() return diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index b1af5b5230e..a020baf05a9 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -16,6 +16,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = 2 mob_size = MOB_SIZE_TINY + gold_core_spawnable = 2 /mob/living/simple_animal/butterfly/New() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 3268bd3007e..9c253d5d9c1 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -20,6 +20,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" + gold_core_spawnable = 2 //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -31,6 +32,7 @@ gender = FEMALE var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target + gold_core_spawnable = 0 /mob/living/simple_animal/pet/cat/Runtime/Life() //MICE! @@ -69,6 +71,7 @@ /mob/living/simple_animal/pet/cat/Proc name = "Proc" + gold_core_spawnable = 0 /mob/living/simple_animal/pet/cat/kitten name = "kitten" diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index ef3ce5448ad..7bf0522ab86 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -19,6 +19,7 @@ ventcrawler = 2 var/obj/item/inventory_head var/obj/item/inventory_mask + gold_core_spawnable = 2 /mob/living/simple_animal/crab/Life() ..() @@ -40,4 +41,5 @@ desc = "It's Coffee, the other pet!" response_help = "pets" response_disarm = "gently pushes aside" - response_harm = "stomps" \ No newline at end of file + response_harm = "stomps" + gold_core_spawnable = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index bc0ebe9883b..e179fcee28d 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -29,6 +29,7 @@ var/obj/item/inventory_head var/obj/item/inventory_back var/facehugger + gold_core_spawnable = 2 /mob/living/simple_animal/pet/dog/pug name = "\improper pug" @@ -39,6 +40,7 @@ icon_living = "pug" icon_dead = "pug_dead" butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug = 3) + gold_core_spawnable = 2 /mob/living/simple_animal/pet/dog/corgi/New() ..() @@ -388,6 +390,7 @@ response_help = "pets" response_disarm = "bops" response_harm = "kicks" + gold_core_spawnable = 0 /mob/living/simple_animal/pet/dog/corgi/Ian/Life() ..() @@ -511,6 +514,7 @@ response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 + gold_core_spawnable = 0 //Lisa already has a cute bow! /mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 96b24a86fe7..440798466fb 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -105,6 +105,7 @@ attack_sound = 'sound/weapons/punch1.ogg' health = 50 var/datum/reagents/udder = null + gold_core_spawnable = 2 /mob/living/simple_animal/cow/New() udder = new(50) @@ -169,6 +170,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() ..() @@ -219,6 +221,7 @@ var/global/chicken_count = 0 var/list/feedMessages = list("It clucks happily.","It clucks happily.") var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") var/list/validColors = list("brown","black","white") + gold_core_spawnable = 2 /mob/living/simple_animal/chicken/New() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index fefd67e907a..a6c4768344b 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -17,8 +17,10 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" + gold_core_spawnable = 2 //Captain fox /mob/living/simple_animal/pet/fox/Renault name = "Renault" - desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" \ No newline at end of file + desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" + gold_core_spawnable = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index b03101df7f1..e958eea35e9 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -18,3 +18,4 @@ density = 0 pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL + gold_core_spawnable = 2 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 9b0bc3afd0c..fbe54636bcb 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -22,6 +22,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY var/body_color //brown, gray and white, leave blank for random + gold_core_spawnable = 2 /mob/living/simple_animal/mouse/New() ..() @@ -77,6 +78,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "splats" + gold_core_spawnable = 0 /obj/item/trash/deadmouse name = "dead mouse" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 08ca902017d..56465782b39 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -29,6 +29,7 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM unique_name = 1 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/alien/drone name = "alien drone" @@ -130,6 +131,7 @@ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 10, /obj/item/stack/sheet/animalhide/xeno = 2) mob_size = MOB_SIZE_LARGE + gold_core_spawnable = 0 /obj/item/projectile/neurotox name = "neurotoxin" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 651d97dcb56..b091ed92d39 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -33,6 +33,7 @@ maxbodytemp = 1500 faction = list("russian") + gold_core_spawnable = 1 //SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! /mob/living/simple_animal/hostile/bear/Hudson diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 5c9265578f8..7e1e6677337 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -21,6 +21,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_SMALL flying = 1 + gold_core_spawnable = 1 //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index dd872f00853..1fdef2619ff 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -31,6 +31,7 @@ faction = list("carp") flying = 1 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0) return 1 //No drifting in space for space carp! //original comments do not steal @@ -45,6 +46,7 @@ icon_state = "holocarp" icon_living = "holocarp" maxbodytemp = INFINITY + gold_core_spawnable = 0 /mob/living/simple_animal/hostile/carp/holocarp/death() ..(1) diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 173d8ff913f..66dc786c974 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -13,4 +13,4 @@ attack_sound = 'sound/weapons/bite.ogg' faction = list("creature") speak_emote = list("screams") - + gold_core_spawnable = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index c74afd3be1b..a85c82a9cf9 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -26,6 +26,7 @@ minbodytemp = 0 faction = list("faithless") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 9eb111c521e..a8a4cdc4357 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -45,6 +45,7 @@ attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' unique_name = 1 + gold_core_spawnable = 1 //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 587e686d67d..18160d68ad2 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -20,6 +20,7 @@ ventcrawler = 2 var/datum/mind/origin var/egg_lain = 0 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index ce67552c952..37981ec6a39 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -21,6 +21,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 speak_emote = list("states") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/hivebot/range name = "hivebot" diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 4677cb50cc9..5c032e21bc7 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -23,3 +23,4 @@ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 150 maxbodytemp = 500 + gold_core_spawnable = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 5e0f67211e6..877739d8bd8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -26,6 +26,7 @@ faction = list("mimic") move_to_delay = 9 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/mimic/death() ..(1) @@ -109,6 +110,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca var/mob/living/creator = null // the creator var/destroy_objects = 0 var/knockdown_people = 0 + gold_core_spawnable = 0 /mob/living/simple_animal/hostile/mimic/copy/New(loc, obj/copy, mob/living/creator, destroy_original = 0) ..(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 8ff2d451a10..491fd2c1440 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -44,6 +44,7 @@ var/cannot_be_seen = 1 var/mob/living/creator = null + gold_core_spawnable = 1 // No movement while seen code. diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 9e6358e8a21..f04ded89b18 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -134,6 +134,7 @@ mob_size = MOB_SIZE_TINY flying = 1 speak_emote = list("states") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/viscerator/death(gibbed) ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 0acc9aad7ef..fa43d85572e 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -33,6 +33,7 @@ faction = list("hostile") var/drop_type = /obj/item/stack/sheet/mineral/wood + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/tree/AttackingTarget() ..() diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 41c36669023..f600071a076 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -56,6 +56,7 @@ friendly = "grooms" mob_size = MOB_SIZE_SMALL flying = 1 + gold_core_spawnable = 2 var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created @@ -809,6 +810,7 @@ name = "Poly" desc = "Poly the Parrot. An expert on quantum cracker theory." speak = list("Poly wanna cracker!", ":e Check the singlo, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS FREE CALL THE SHUTTLE") + gold_core_spawnable = 0 /mob/living/simple_animal/parrot/Poly/New() ears = new /obj/item/device/radio/headset/headset_eng(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 64a70739e32..dd15c2f2a49 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -57,6 +57,8 @@ var/obj/item/weapon/card/id/access_card = null //innate access uses an internal ID card var/flying = 0 //whether it's flying or touching the ground. + 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() ..() verbs -= /mob/verb/observe diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 610522c91df..51d3caf2b15 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -24,46 +24,15 @@ /datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon") if(holder && holder.my_atom) - var/list/meancritters = list(/mob/living/simple_animal/hostile/blob/blobspore, // list of possible hostile mobs - /mob/living/simple_animal/hostile/blob/blobbernaut, - /mob/living/simple_animal/hostile/carp/ranged/chaos, - /mob/living/simple_animal/hostile/carp/ranged, - /mob/living/simple_animal/hostile/carp/megacarp, - /mob/living/simple_animal/hostile/carp/eyeball, - /mob/living/simple_animal/hostile/carp, - /mob/living/simple_animal/hostile/alien/drone, - /mob/living/simple_animal/hostile/alien/sentinel, - /mob/living/simple_animal/hostile/alien/queen, - /mob/living/simple_animal/hostile/alien, - /mob/living/simple_animal/hostile/bear/Hudson, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/poison/bees, - /mob/living/simple_animal/hostile/poison/giant_spider/nurse, - /mob/living/simple_animal/hostile/poison/giant_spider/hunter, - /mob/living/simple_animal/hostile/poison/giant_spider, - /mob/living/simple_animal/hostile/creature, - /mob/living/simple_animal/hostile/faithless, - /mob/living/simple_animal/hostile/headcrab, - /mob/living/simple_animal/hostile/hivebot/range, - /mob/living/simple_animal/hostile/hivebot/rapid, - /mob/living/simple_animal/hostile/hivebot/strong, - /mob/living/simple_animal/hostile/hivebot, - /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/mimic/crate, - /mob/living/simple_animal/hostile/mimic, - /mob/living/simple_animal/hostile/statue, - /mob/living/simple_animal/hostile/viscerator, - /mob/living/simple_animal/hostile/tree/festivus, - /mob/living/simple_animal/hostile/tree) - - var/list/nicecritters = list(/mob/living/simple_animal/crab, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/lizard, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/chicken) // and possible friendly mobs - nicecritters += typesof(/mob/living/simple_animal/pet) - /mob/living/simple_animal/pet + var/list/meancritters = list() // list of possible hostile mobs + var/list/nicecritters = list() // and possible friendly mobs + for(var/T in typesof(/mob/living/simple_animal)) + var/mob/living/simple_animal/M = new T + switch(M.gold_core_spawnable) + if(1) + meancritters += M.type + if(2) + nicecritters += M.type var/atom/A = holder.my_atom var/turf/T = get_turf(A) var/area/my_area = get_area(T) @@ -83,22 +52,17 @@ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) C.flash_eyes() for(var/i = 1, i <= amount_to_spawn, i++) + var/chosen if (reaction_name == "Friendly Gold Slime") - var/chosen = pick(nicecritters) - var/mob/living/simple_animal/C = new chosen - C.faction |= mob_faction - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) + chosen = pick(nicecritters) else - var/chosen = pick(meancritters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= mob_faction - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) + chosen = pick(meancritters) + var/mob/living/simple_animal/C = new chosen + C.faction |= mob_faction + C.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) /datum/chemical_reaction/proc/goonchem_vortex(turf/simulated/T, setting_type, range) for(var/atom/movable/X in orange(range, T)) From d8be2d5ded0206bf1b0266d1a61fd1f0e7163a25 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Sat, 22 Aug 2015 17:42:37 +1000 Subject: [PATCH 09/51] removes time limit on tempbans --- code/modules/admin/topic.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index e611c96300d..343d1c7912f 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -443,7 +443,6 @@ mins = minutes - CMinutes mins = input(usr,"How long (in minutes)? (Default: 1440)","Ban time",mins ? mins : 1440) as num|null if(!mins) return - mins = min(525599,mins) minutes = CMinutes + mins duration = GetExp(minutes) reason = input(usr,"Reason?","reason",reason2) as text|null @@ -1065,7 +1064,6 @@ var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) return - if(mins >= 525600) mins = 525599 var/reason = input(usr,"Reason?","reason","Griefer") as text|null if(!reason) return From 53479059eb6b7e3dd6593ec3c3bfaaf39c482f98 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Sat, 22 Aug 2015 21:02:05 +1000 Subject: [PATCH 10/51] fixes nonalpha dbnote search --- code/modules/admin/sql_notes.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 730e4531575..d5f7f767166 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -147,7 +147,8 @@ var/search output += "
\[Add Note\]
" output += ruler - index = sanitizeSQL(index) + if(!isnum(index)) + index = sanitizeSQL(index) switch(index) if(1) search = "^." From 90f54ba95cc1bee86702b33e063bb7564351b64f Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 23 Aug 2015 19:34:09 +0200 Subject: [PATCH 11/51] Fixes the do_after progress bar appearing on a coin when flipping+throwing it. --- code/modules/mining/ores_coins.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index e1089f54ac3..efaac579681 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -326,7 +326,9 @@ flick("coin_[cmineral]_flip", src) icon_state = "coin_[cmineral]_[coinflip]" playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1) - if(do_after(user, 15, target = src)) + var/oldloc = loc + sleep(15) + if(loc == oldloc && user && !user.incapacitated()) user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \ "You flip [src]. It lands on [coinflip].", \ "You hear the clattering of loose change.") \ No newline at end of file From 27b7e3b6f622606b200bce99341ba5218a9978fa Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 23 Aug 2015 20:55:41 +0200 Subject: [PATCH 12/51] Beds no longer use this trick in Move() so neither should the mulebot. --- code/game/machinery/bots/mulebot.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index fca41d8291e..8f69d506dc5 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -87,14 +87,12 @@ obj/machinery/bot/mulebot/bot_reset() obj/machinery/bot/mulebot/Move(atom/newloc, direct) . = ..() if(buckled_mob) - buckled_mob.buckled = null 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 - buckled_mob.buckled = src obj/machinery/bot/mulebot/Process_Spacemove(movement_dir = 0) if(buckled_mob) From 20023f79d76617495ea73e32234977c4450e0ca3 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 23 Aug 2015 21:39:22 +0200 Subject: [PATCH 13/51] Mobs buckled to mulebots now pass through plastic flaps. All ventcrawler and tiny sized mobs also pass through them now. --- code/game/machinery/computer/shuttle.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 2ea4b0b285e..460adf2b0d8 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -93,7 +93,9 @@ else if(istype(A, /mob/living)) // You Shall Not Pass! var/mob/living/M = A - if(!M.lying && !ismonkey(M) && !isslime(M)) //If your not laying down, or a small creature, no pass. + if(M.buckled && istype(M.buckled, /obj/machinery/bot/mulebot)) // mulebot passenger gets a free pass. + return 1 + if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. return 0 return ..() From 69575145321ee89502f6fecb659985622da038b8 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 23 Aug 2015 14:09:35 -0700 Subject: [PATCH 14/51] Fixes a rounding error causing dynamic wait to be sluggish to kick in --- code/controllers/master_controller.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index a4639a42327..31bdbd542a8 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -103,7 +103,7 @@ calculate the longest number of ticks the MC can wait between each cycle without var/oldwait = SS.wait var/GlobalCostDelta = (SSCostPerSecond-(SS.cost/(SS.wait/10)))-1 var/NewWait = MC_AVERAGE(oldwait,(SS.cost-SS.dwait_buffer+GlobalCostDelta)*SS.dwait_delta) - SS.wait = Clamp(round(NewWait,world.tick_lag),SS.dwait_lower,SS.dwait_upper) + SS.wait = Clamp(NewWait,SS.dwait_lower,SS.dwait_upper) if (oldwait != SS.wait) calculateGCD() SS.next_fire += SS.wait @@ -147,4 +147,4 @@ calculate the longest number of ticks the MC can wait between each cycle without msg += "\t [varname] = [varval]\n" world.log << msg - subsystems = master_controller.subsystems \ No newline at end of file + subsystems = master_controller.subsystems From b81ea02552e1d9c123bb632b5964a0db1c8ee2b3 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Mon, 24 Aug 2015 04:25:47 -0300 Subject: [PATCH 15/51] Hardsuit helmets will now store the suit as a var and they will qdel eachother when deleted. --- code/modules/clothing/spacesuits/hardsuit.dm | 1 + code/modules/clothing/suits/toggles.dm | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 06bdfc347d6..334c76fca27 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -10,6 +10,7 @@ var/basestate = "hardsuit" var/brightness_on = 4 //luminosity when on var/on = 0 + var/obj/item/clothing/suit/space/hardsuit/suit item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite) action_button_name = "Toggle Helmet Light" flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index d8d1f409691..9a3efc5d2ad 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -90,7 +90,6 @@ user << "Alt-click on [src] to toggle the [togglename]." //Hardsuit toggle code - /obj/item/clothing/suit/space/hardsuit/New() MakeHelmet() if(!jetpack) @@ -98,15 +97,24 @@ verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets ..() /obj/item/clothing/suit/space/hardsuit/Destroy() - qdel(helmet) + if(helmet) + helmet.suit = null + qdel(helmet) qdel(jetpack) ..() +/obj/item/clothing/head/helmet/space/hardsuit/Destroy() + if(suit) + suit.helmet = null + qdel(suit) + ..() + /obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet() if(!helmettype) return if(!helmet) var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src) + W.suit = src helmet = W /obj/item/clothing/suit/space/hardsuit/ui_action_click() @@ -121,7 +129,7 @@ ..() /obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet() - if(!helmettype) + if(!helmet) return suittoggled = 0 if(ishuman(helmet.loc)) From a9b555d57e0348cc680487d0dbeba9df4b60ed57 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Mon, 24 Aug 2015 05:11:36 -0300 Subject: [PATCH 16/51] Fixes a runtime where the xeno hallucination fails to find a vent to spawn the alien. --- code/modules/flufftext/Hallucination.dm | 27 +++++++++++++------------ 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 98a01e01182..64a7e9fc72f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -188,19 +188,20 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!U.welded) pump = U break - xeno = new(pump.loc,target) - sleep(10) - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) - sleep(10) - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) - sleep(10) - var/xeno_name = xeno.name - target << "[xeno_name] begins climbing into the ventilation system..." - sleep(10) - qdel(xeno) - target << "[xeno_name] scrambles into the ventilation ducts!" + if(pump) + xeno = new(pump.loc,target) + sleep(10) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) + sleep(10) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) + sleep(10) + var/xeno_name = xeno.name + target << "[xeno_name] begins climbing into the ventilation system..." + sleep(10) + qdel(xeno) + target << "[xeno_name] scrambles into the ventilation ducts!" qdel(src) /obj/effect/hallucination/singularity_scare From 9cfb246e4f17b57cf98059912fd01ba284669263 Mon Sep 17 00:00:00 2001 From: c0 Date: Mon, 24 Aug 2015 11:33:52 +0300 Subject: [PATCH 17/51] Removes dirt from walking on tiles --- code/game/objects/items/weapons/mop.dm | 3 --- code/game/objects/structures/janicart.dm | 3 --- code/game/turfs/simulated/floor.dm | 19 ------------------- .../game/turfs/simulated/floor/fancy_floor.dm | 1 - code/game/turfs/simulated/floor/misc_floor.dm | 3 --- code/modules/events/spacevine.dm | 1 - code/modules/mining/mine_turfs.dm | 1 - .../modules/mob/living/silicon/robot/robot.dm | 3 --- .../Chemistry-Reagents/Other-Reagents.dm | 4 ---- 9 files changed, 38 deletions(-) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 60b08e58e64..2b4f54b5679 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -25,9 +25,6 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1)) A.clean_blood() A.thermite = 0 - var/turf/simulated/floor/F = A - if(istype(F)) - F.dirt = 0 for(var/obj/effect/O in A) if(is_cleanable(O)) qdel(O) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 7246ac3dbbd..3ac8658347c 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -181,9 +181,6 @@ var/turf/tile = loc if(isturf(tile)) tile.clean_blood() - if (istype(tile, /turf/simulated/floor)) - var/turf/simulated/floor/F = tile - F.dirt = 0 for(var/A in tile) if(istype(A, /obj/effect)) if(is_cleanable(A)) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 9bd230386c0..6b23686fbca 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -32,8 +32,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") var/list/burnt_states = list() - var/dirt = 0 - var/ignoredirt = 0 /turf/simulated/floor/New() ..() @@ -167,22 +165,5 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," if(prob(20)) ChangeTurf(/turf/simulated/floor/plasteel/cult) -/turf/simulated/floor/Entered(atom/A, atom/OL) - ..() - if(!ignoredirt) - if(has_gravity(src)) - if(istype(A,/mob/living/carbon)) - var/mob/living/carbon/M = A - if(M.lying) return - if(prob(80)) - dirt++ - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src) - if(dirt >= 100) - if(!dirtoverlay) - dirtoverlay = new/obj/effect/decal/cleanable/dirt(src) - dirtoverlay.alpha = 10 - else if(dirt > 100) - dirtoverlay.alpha = min(dirtoverlay.alpha+10, 200) - /turf/simulated/floor/can_have_cabling() return !burnt & !broken & !lava diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 3e3a1f61358..05a0c9d9c51 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -26,7 +26,6 @@ icon_state = "grass" floor_tile = /obj/item/stack/tile/grass broken_states = list("sand") - ignoredirt = 1 /turf/simulated/floor/grass/New() ..() diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index c7a21ef6f92..067ebe88eed 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -21,7 +21,6 @@ /turf/simulated/floor/plating/beach name = "Beach" icon = 'icons/misc/beach.dmi' - ignoredirt = 1 /turf/simulated/floor/plating/beach/ex_act(severity, target) contents_explosion(severity, target) @@ -43,13 +42,11 @@ ..() name = "Iron Sand" icon_state = "ironsand[rand(1,15)]" - ignoredirt = 1 /turf/simulated/floor/plating/snow name = "snow" icon = 'icons/turf/snow.dmi' icon_state = "snow" - ignoredirt = 1 /turf/simulated/floor/plating/snow/ex_act(severity, target) contents_explosion(severity, target) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index c633246b3e4..7f87245bf41 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -66,7 +66,6 @@ color = "#aa77aa" icon_state = "vinefloor" broken_states = list() - ignoredirt = 1 //All of this shit is useless for vines diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 24a358a10b2..955d80d3f0e 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -509,7 +509,6 @@ var/global/list/rockTurfEdgeCache icon_state = "asteroid" icon_plating = "asteroid" var/dug = 0 //0 = has not yet been dug, 1 = has already been dug - ignoredirt = 1 /turf/simulated/floor/plating/asteroid/airless oxygen = 0.01 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f22de8919e0..f5a452c3ac3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -862,9 +862,6 @@ var/turf/tile = loc if(isturf(tile)) tile.clean_blood() - if (istype(tile, /turf/simulated/floor)) - var/turf/simulated/floor/F = tile - F.dirt = 0 for(var/A in tile) if(istype(A, /obj/effect)) if(is_cleanable(A)) diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 76ce0b07ebe..fe2c2bdb8c0 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -646,10 +646,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) From 20ba3071edd9cd32f89d8152406498e356412a94 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Mon, 24 Aug 2015 07:52:54 -0300 Subject: [PATCH 18/51] Fixes the brand intelligence event not triggering the uprising under certain conditions. Adds a new proc for the list helpers, removeNullsFromList() It does what it says. --- code/__HELPERS/lists.dm | 8 +++++++- code/modules/events/brand_intelligence.dm | 6 +----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 2ec7b4c407f..66ae50cf852 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -342,4 +342,10 @@ for(var/datum/D in L) if(D.vars.Find(varname)) if(D.vars[varname] == value) - return D \ No newline at end of file + return D + +//remove all nulls from a list +/proc/removeNullsFromList(list/L) + while(L.Remove(null)) + continue + return L \ No newline at end of file diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 9a55d77b4ad..f373fad4af6 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -7,7 +7,6 @@ /datum/round_event/brand_intelligence announceWhen = 21 endWhen = 1000 //Ends when all vending machines are subverted anyway. - var/list/obj/machinery/vending/vendingMachines = list() var/list/obj/machinery/vending/infectedMachines = list() var/obj/machinery/vending/originMachine @@ -28,11 +27,9 @@ for(var/obj/machinery/vending/V in machines) if(V.z != 1) continue vendingMachines.Add(V) - if(!vendingMachines.len) kill() return - originMachine = pick(vendingMachines) vendingMachines.Remove(originMachine) originMachine.shut_up = 0 @@ -48,7 +45,7 @@ originMachine.visible_message("[originMachine] beeps and seems lifeless.") kill() return - + vendingMachines = removeNullsFromList(vendingMachines) if(!vendingMachines.len) //if every machine is infected for(var/obj/machinery/vending/upriser in infectedMachines) if(prob(70) && !upriser.gc_destroyed) @@ -62,7 +59,6 @@ kill() return - if(IsMultiple(activeFor, 4)) var/obj/machinery/vending/rebel = pick(vendingMachines) vendingMachines.Remove(rebel) From cb1cd5b1e78d8e670b2a9897e8716ca61144b97f Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 24 Aug 2015 17:07:09 +0200 Subject: [PATCH 19/51] Monkey and aliens now all use carbon/examine(). Fixes monkeys being able to strip and uncuff people while handcuffed themselves. Add an inhand sprite for facehuggers (taken from Xhuis) (but they don't appear for large queens, it'd look ugly). Xenos now regenerate plasma on alien weed even when injured but at half the normal rate. Moved queen/large/update_icons() to humanoid/update_icons.dm --- code/game/machinery/machinery.dm | 2 + code/modules/mining/equipment_locker.dm | 1 + .../mob/living/carbon/alien/humanoid/queen.dm | 14 --- .../carbon/alien/humanoid/update_icons.dm | 27 ++++- .../modules/mob/living/carbon/alien/organs.dm | 1 + .../living/carbon/alien/special/facehugger.dm | 16 +-- .../mob/living/carbon/{monkey => }/examine.dm | 101 ++++++++++-------- icons/mob/inhands/clothing_lefthand.dmi | Bin 60712 -> 62164 bytes icons/mob/inhands/clothing_righthand.dmi | Bin 59935 -> 61380 bytes tgstation.dme | 2 +- 10 files changed, 89 insertions(+), 75 deletions(-) rename code/modules/mob/living/carbon/{monkey => }/examine.dm (65%) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 4952544aeb7..a4cdf6f6470 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -230,6 +230,8 @@ Class Procs: return /mob/living/canUseTopic(atom/movable/M, be_close = 0, no_dextery = 0) + if(incapacitated()) + return if(no_dextery) if(be_close && in_range(M, src)) return 1 diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index f0e699253be..36b7e7e4eb4 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -573,6 +573,7 @@ /**********************Facehugger toy**********************/ /obj/item/clothing/mask/facehugger/toy + item_state = "facehugger_inactive" desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something." throwforce = 0 real = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 03745eb7306..c077bd38b5b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -77,17 +77,3 @@ icon_state = "queen_s" pixel_x = -16 mob_size = MOB_SIZE_LARGE - -/mob/living/carbon/alien/humanoid/queen/large/update_icons() - update_hud() //TODO: remove the need for this to be here - overlays.Cut() - if(stat == DEAD) - icon_state = "queen_dead" - else if((stat == UNCONSCIOUS && !sleeping) || weakened) - icon_state = "queen_l" - else if(sleeping || lying || resting) - icon_state = "queen_sleep" - else - icon_state = "queen_s" - for(var/image/I in overlays_standing) - overlays += I diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 1495d4f99d3..de272e0c0d7 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -50,4 +50,29 @@ if(lying > 0) lying = 90 //Anything else looks retarded ..() - update_icons() \ No newline at end of file + update_icons() + + +/mob/living/carbon/alien/humanoid/queen/large/update_icons() + update_hud() //TODO: remove the need for this to be here + overlays.Cut() + if(stat == DEAD) + icon_state = "queen_dead" + else if((stat == UNCONSCIOUS && !sleeping) || weakened) + icon_state = "queen_l" + else if(sleeping || lying || resting) + icon_state = "queen_sleep" + else + icon_state = "queen_s" + for(var/image/I in overlays_standing) + overlays += I + +/mob/living/carbon/alien/humanoid/queen/large/update_inv_l_hand() + remove_overlay(L_HAND_LAYER) + if(handcuffed) + drop_l_hand() + +/mob/living/carbon/alien/humanoid/queen/large/update_inv_r_hand() + remove_overlay(R_HAND_LAYER) + if(handcuffed) + drop_r_hand() diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index b7db238a99a..b7e09988277 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -79,6 +79,7 @@ var/mod = 1 if(!isalien(owner)) mod = 0.2 + owner.adjustPlasma(plasma_rate/2) owner.adjustBruteLoss(-heal_rate*mod) owner.adjustFireLoss(-heal_rate*mod) owner.adjustOxyLoss(-heal_rate*mod) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 1a9ba9601a2..d4f997ddf7b 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -187,7 +187,6 @@ var/const/MAX_ACTIVE_TIME = 400 else target.visible_message("[src] violates [target]'s face!", \ "[src] violates [target]'s face!") - return /obj/item/clothing/mask/facehugger/proc/GoActive() if(stat == DEAD || stat == CONSCIOUS) @@ -196,20 +195,10 @@ var/const/MAX_ACTIVE_TIME = 400 stat = CONSCIOUS icon_state = "[initial(icon_state)]" -/* for(var/mob/living/carbon/alien/alien in world) - var/image/activeIndicator = image('icons/mob/alien.dmi', loc = src, icon_state = "facehugger_active") - activeIndicator.override = 1 - if(alien && alien.client) - alien.client.images += activeIndicator */ - - return - /obj/item/clothing/mask/facehugger/proc/GoIdle() if(stat == DEAD || stat == UNCONSCIOUS) return -/* RemoveActiveIndicators() */ - stat = UNCONSCIOUS icon_state = "[initial(icon_state)]_inactive" @@ -221,15 +210,12 @@ var/const/MAX_ACTIVE_TIME = 400 if(stat == DEAD) return -/* RemoveActiveIndicators() */ - icon_state = "[initial(icon_state)]_dead" + item_state = "facehugger_inactive" stat = DEAD visible_message("[src] curls up into a ball!") - return - /proc/CanHug(mob/living/M) if(!istype(M)) return 0 diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/examine.dm similarity index 65% rename from code/modules/mob/living/carbon/monkey/examine.dm rename to code/modules/mob/living/carbon/examine.dm index 48963b00eed..e46f62193d8 100644 --- a/code/modules/mob/living/carbon/monkey/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -1,45 +1,58 @@ -/mob/living/carbon/monkey/examine(mob/user) - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" - - if (src.handcuffed) - msg += "It is \icon[src.handcuffed] handcuffed!\n" - if (src.head) - msg += "It has \icon[src.head] \a [src.head] on its head. \n" - if (src.wear_mask) - msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n" - if (src.l_hand) - msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n" - if (src.r_hand) - msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n" - if (src.back) - msg += "It has \icon[src.back] \a [src.back] on its back.\n" - if (src.stat == DEAD) - msg += "It is limp and unresponsive, with no signs of life.\n" - else - msg += "" - if (src.getBruteLoss()) - if (src.getBruteLoss() < 30) - msg += "It has minor bruising.\n" - else - msg += "It has severe bruising!\n" - if (src.getFireLoss()) - if (src.getFireLoss() < 30) - msg += "It has minor burns.\n" - else - msg += "It has severe burns!\n" - - if (src.fire_stacks > 0) - msg += "It's covered in something flammable.\n" - if (src.fire_stacks < 0) - msg += "It's soaked in water.\n" - - if (src.stat == UNCONSCIOUS) - msg += "It isn't responding to anything around it; it seems to be asleep.\n" - msg += "" - - if (src.digitalcamo) - msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n" - - msg += "*---------*" - +/mob/living/carbon/examine(mob/user) + var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + + if (handcuffed) + msg += "It is \icon[src.handcuffed] handcuffed!\n" + if (head) + msg += "It has \icon[src.head] \a [src.head] on its head. \n" + if (wear_mask) + msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n" + if (l_hand) + msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n" + if (r_hand) + msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n" + if (back) + msg += "It has \icon[src.back] \a [src.back] on its back.\n" + if (stat == DEAD) + msg += "It is limp and unresponsive, with no signs of life.\n" + else + msg += "" + var/temp = getBruteLoss() + if(temp) + if (temp < 30) + msg += "It has minor bruising.\n" + else + msg += "It has severe bruising!\n" + + temp = getFireLoss() + if(temp) + if (temp < 30) + msg += "It has minor burns.\n" + else + msg += "It has severe burns!\n" + + temp = getCloneLoss() + if(temp) + if(getCloneLoss() < 30) + msg += "It is slightly deformed.\n" + else + msg += "It is severely deformed.\n" + + if(getBrainLoss() > 60) + msg += "It seems to be clumsy and unable to think.\n" + + if(fire_stacks > 0) + msg += "It's covered in something flammable.\n" + if(fire_stacks < 0) + msg += "It's soaked in water.\n" + + if(stat == UNCONSCIOUS) + msg += "It isn't responding to anything around it; it seems to be asleep.\n" + msg += "" + + if (digitalcamo) + msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n" + + msg += "*---------*" + user << msg \ No newline at end of file diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index d36bbaeda97b83114f3f5c0e0e2bc3ae3adb82ec..84cb19f814b1697e4b92513b49e89ef9b3a87535 100644 GIT binary patch delta 4680 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

Q9RjBA;|XB=gU-8fD}?zxNbNV) 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 U11&3=GlO(61JgSd`p!}R0_W@?rT_o{ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 65366e873a4947ce85918fd570006157054eb7a4..248431514e1ef179378b09b8a4049a428ef155b3 100644 GIT binary patch delta 3862 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 delta 2406 zcmb_bc|6qn8XnoQ+&Gref+%IrI&*~4cFPjdSSIVBq3qd4jPXlHmSl{frjeaUj4%dc z860G3vhQQ5Xr!^9Oc~PQ-23%M<{pFh5z&+|O*`#x{S9B=LjFJ6gfFzt*I(CMi~ z*MMt;+(mk{rWr^CnCmM|Qu>D16s@!QNM9~!M(eJhh7|oc6SKOv%~@+tUESMh=XTH% zivyY1pY!jcAW3986AjFg5jmaP+;1gzucreVZJ~xytFi ziOYO3GC(XGIs43fD9<)sBoCms@xy|BLJOJ^)Bx=Vf`aDgk%6(ha>Z$?UGoOD0X-<4 zln-q^x^hvRmcoDhi9~B`mAH=IJDq$1qP#wTSQzP*=Q%zYR>0Nv z2lySku#PV`skE z&#;90i|&N3PgJZ>y0N#MLLV=&vQSA{WjDdx8`Etxwu~ElA2V;%RG8O!`f7s3jr;)O z=c&^iXN7FdKYV;UmJBXWST6r;c5^%uwpu&0^1f`&-lYTt-elNS*@+sy_ipzS-ux=* z*mMeJ#Lht9`W@VP4mi|VJa8oX-Y1?$Amm}1T_Jegf563Nra!)NL-rG^-C`Rz0N;!1 zehU|9V6oGm2}d3YE+h>_W1~!cs~#+h|9-{bT$*Dd5~o1v*nPRXh3}NvF@m=&Kc2(y z=C$?5C@WnlmAIxzr9QYpEKz(T>(!Hp@I4z$=NRc?@*oZiK(cbBq~&vuXQkZPyH7I8 zJ;?+2USGSjSS6E+Ut-X@suvEO)>*gJ63()g}S&eFNlEkscy=H+nWUc8Cqjb*~NIaV0RED@ z5FERiyq2fl2YlkD%6q)QCOjaT>MiTVWiR~3n=6-Gc}0Puh3N?(;s}vai|TbJV~ItV zW(_2T3UuU{l-Lg5JLlh;`1;Oqag05yQ+*CnIv8u44=eolL&4CirtXqN((uI|xNko{ z>!|M-&#OAtQMH=gtR_1FWKEcgpzbZ9==e5G(l}fXP@d=MoIH}r9OWKcW*VNSvE$-~ z^8%tiSt^3``fV)&TKTcLk)r-n(uw4w!Xmx96cF5PZ$6H0m1|SpTIC2Th`*WAka5lA z6tm~L#v(e_tBjVtcuudRAhioUou6C&*8%%erme^!c`z18r&5u`wL}VRpHg{>10JN1CHJUa2}) zSx&&ezP+_E*t!}E{_Ris<)r1(xRlJ*HdanIN=yLEj#pTY&Bv27;L^EvBzr$<3e}s8 z)>UnR)t?!hD&49WciD+)3*L6Em~)|HLr%s-$bdl4$|*_mNJH4h2zF=*5XyOYSVP#j z<^%}jZtfu<3feE1%OKtZB#O5lKy-gz$dov5CDr|hd;F7{Cf*am z*)w%p71}4qe+=c;gf~DCRqV_R*;KW$6BL+{&crEOHwKU3Mmr2So%8 zB@HW&V9F3lCxrU@AIg?zB#qu`E^|DMg^7>SHFciKSd6ck|BNW=7Et9TpdzmMm?*tK z8734?28SvXr?tGyH(zQWNBTRAuwjvEL2{b=`u-ui5*>r8rKqRWbDDTxL|2ACp%k{n zDD@7Fyv$B6AO9ZiVtdXt%ZnbZdkGqqtIlH$+fSlNm=}F>CMC~w*+z4jgeY5JXrTSozP;+5#dLan zJv~t%bUxGwVgfBT>qM{~7c~sgMlrKFvSz*GlPc+{|6QDzd+PCQf>ZqEUnx=kqhA}& z%0-Iz;v#@1)AqTul=+XC*<2oxrc-i_N>|lTHDgmyZIis5k@+20`Q)X|iRtzyCuXOs{^3xX~+&4Dz2Wl4wD0 zeZ-R+-{XuAtJ=9fCCi8k*f+j$AV|{#t!Kj)e#pSTCrZPWe4-Z>w;&zio6Sh6&FhLS z`f@8{Kl-i^+%y>ViVL||7lfKCDWgGP5giG9@ciY?23$QJ73a*xWLte} zTF0K>*AucwsAlI3L|oWiNVe;4YH(3=^LdXq8(PPTnLO|SrwNl9;6AkehUsed)akVV zyx})3qW5z*-S_zw4kZ8!>6){`c1JfY$tJeRnxa|J$ZxaxM A&j0`b diff --git a/tgstation.dme b/tgstation.dme index 383abb503be..4b0e32905e0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1116,6 +1116,7 @@ #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\death.dm" #include "code\modules\mob\living\carbon\emote.dm" +#include "code\modules\mob\living\carbon\examine.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\life.dm" #include "code\modules\mob\living\carbon\say.dm" @@ -1181,7 +1182,6 @@ #include "code\modules\mob\living\carbon\human\whisper.dm" #include "code\modules\mob\living\carbon\monkey\death.dm" #include "code\modules\mob\living\carbon\monkey\emote.dm" -#include "code\modules\mob\living\carbon\monkey\examine.dm" #include "code\modules\mob\living\carbon\monkey\inventory.dm" #include "code\modules\mob\living\carbon\monkey\life.dm" #include "code\modules\mob\living\carbon\monkey\login.dm" From 5cecd7e9fec19b28ba873d92fc76f497695a53f8 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 24 Aug 2015 19:54:51 +0200 Subject: [PATCH 20/51] Simplifies plasmavessel/on_life() a bit, and make xeno on weeds also heal clone damage. --- code/modules/mob/living/carbon/alien/organs.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index b7e09988277..15573748de6 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -73,16 +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.adjustPlasma(plasma_rate/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) ..() From 909658f240bf38255643174317f17de3019c22d5 Mon Sep 17 00:00:00 2001 From: Supermichael777 Date: Mon, 24 Aug 2015 14:20:31 -0400 Subject: [PATCH 21/51] Update buckling.dm --- code/game/objects/buckling.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 0c781f27f9b..88a0b285c62 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -88,7 +88,7 @@ M.visible_message(\ "[M.name] is buckled to [src] by [user.name]!",\ "You are buckled to [src] by [user.name]!",\ - "You heat metal clanking.") + "You hear metal clanking.") /obj/proc/user_unbuckle_mob(mob/user) var/mob/living/M = unbuckle_mob() From e65ddd0827a3ec8ac08ef9acc679a7e1d7ac2d12 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Tue, 25 Aug 2015 05:11:55 +1000 Subject: [PATCH 22/51] note ckey fix --- code/modules/admin/topic.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3093d959d6d..152c67b95f6 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -505,7 +505,7 @@ feedback_inc("ban_appearance",1) DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason) appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") - add_note(M.ckey, "Appearance banned - [reason]", null, usr, 0) + add_note(M.ckey, "Appearance banned - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]") M << "You have been appearance banned by [usr.client.ckey]." M << "The reason is: [reason]" @@ -921,7 +921,7 @@ msg = job else msg += ", [job]" - add_note(M.ckey, "Banned from [msg] - [reason]", null, usr, 0) + add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes") M << "You have been jobbanned by [usr.client.ckey] from: [msg]." M << "The reason is: [reason]" @@ -941,7 +941,7 @@ jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") if(!msg) msg = job else msg += ", [job]" - add_note(M.ckey, "Banned from [msg] - [reason]", null, usr, 0) + add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]") M << "You have been jobbanned by [usr.client.ckey] from: [msg]." M << "The reason is: [reason]" From 1f37141b8bf29fbbffd6c076b37efc89a5cb0357 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 24 Aug 2015 22:53:45 +0200 Subject: [PATCH 23/51] Alien humanoids and monkeys can now use "me". Alien hivemind chat now uses (dark purple). Also the alien queen name now appears bigger in the hivemind chat. --- .../mob/living/carbon/alien/humanoid/emote.dm | 8 +++++--- code/modules/mob/living/carbon/alien/say.dm | 8 ++++++-- code/modules/mob/living/carbon/emote.dm | 5 +++++ .../modules/mob/living/carbon/monkey/emote.dm | 19 ++++++++++--------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index 5270fdabb6d..6129dd7ef77 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/humanoid/emote(act) +/mob/living/carbon/alien/humanoid/emote(act,m_type=1,message = null) var/param = null if (findtext(act, "-", 1, null)) @@ -7,8 +7,6 @@ act = copytext(act, 1, t1) var/muzzled = is_muzzled() - var/m_type = 1 - var/message switch(act) //Alphabetical please if ("deathgasp","deathgasps") @@ -25,6 +23,10 @@ message = "[src] hisses." m_type = 2 + if ("me") + ..() + return + if ("moan","moans") message = "[src] moans!" m_type = 2 diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index a674add3ff1..c1009164427 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -3,16 +3,20 @@ if(.) playsound(loc, "hiss", 25, 1, 1) //erp just isn't the same without sound feedback -/mob/living/proc/alien_talk(message) +/mob/living/proc/alien_talk(message, shown_name = name) log_say("[key_name(src)] : [message]") message = trim(message) if(!message) return var/message_a = say_quote(message) - var/rendered = "Hivemind, [name] [message_a]" + var/rendered = "Hivemind, [shown_name] [message_a]" for(var/mob/S in player_list) if((!S.stat && S.hivecheck()) || (S in dead_mob_list)) S << rendered +/mob/living/carbon/alien/humanoid/queen/alien_talk(message, shown_name = name) + shown_name = "[shown_name]" + ..(message, shown_name) + /mob/living/carbon/hivecheck() return getorgan(/obj/item/organ/internal/alien/hivenode) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 2009c2bc5fe..1f1717517df 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -111,6 +111,11 @@ else message = "[src] makes a noise." + if ("me") + if(!silent) + ..() + return + if ("nod","nods") message = "[src] nods." m_type = 1 diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm index 42adb99ec59..b2b739109b2 100644 --- a/code/modules/mob/living/carbon/monkey/emote.dm +++ b/code/modules/mob/living/carbon/monkey/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/monkey/emote(act) +/mob/living/carbon/monkey/emote(act,m_type=1,message = null) var/param = null if (findtext(act, "-", 1, null)) @@ -6,10 +6,7 @@ param = copytext(act, t1 + 1, length(act) + 1) act = copytext(act, 1, t1) - var/muzzled = is_muzzled() - var/m_type = 1 - var/message switch(act) //Ooh ooh ah ah keep this alphabetical ooh ooh ah ah! if ("deathgasp","deathgasps") @@ -21,15 +18,19 @@ message = "[src] gnarls and shows its teeth.." m_type = 2 - if ("paw") - if (!src.restrained()) - message = "[src] flails its paw." - m_type = 1 + if ("me") + ..() + return if ("moan","moans") message = "[src] moans!" m_type = 2 + if ("paw") + if (!src.restrained()) + message = "[src] flails its paw." + m_type = 1 + if ("roar","roars") if (!muzzled) message = "[src] roars." @@ -67,7 +68,7 @@ src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, gnarl, giggle, glare-(none)/mob, grin, jump, laugh, look, me, moan, nod, paw, point-(atom), roar, roll, scream, scratch, screech, shake, shiver, sigh, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave whimper, wink, yawn" else - ..(act) + ..() if ((message && src.stat == 0)) if(src.client) From ce8722b86898c412c5fb2af1cf60ec7eefd4b262 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 24 Aug 2015 21:36:50 -0400 Subject: [PATCH 24/51] Fixes burn kits containing salicyclic acid pills. --- code/game/objects/items/weapons/storage/firstaid.dm | 4 ++-- code/modules/reagents/reagent_containers/pill.dm | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index f1347bcd07e..16b4767ceba 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -45,8 +45,8 @@ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/salicyclic(src) - new /obj/item/weapon/reagent_containers/pill/salicyclic(src) + new /obj/item/weapon/reagent_containers/pill/kelotane(src) + new /obj/item/weapon/reagent_containers/pill/kelotane(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 2a99e768c75..8246b5a7eb7 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -134,6 +134,13 @@ list_reagents = list("sal_acid" = 24) roundstart = 1 +/obj/item/weapon/reagent_containers/pill/kelotane + name = "kelotane pill" + desc = "Catalyzes the healing of burns." + icon_state = "pill5" + list_reagents = list("kelotane" = 20) + roundstart = 1 + /obj/item/weapon/reagent_containers/pill/insulin name = "insulin pill" desc = "Handles hyperglycaemic coma." From 132adf3f0045ff16e314ff1922b7d8f025fa7315 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 24 Aug 2015 21:45:18 -0400 Subject: [PATCH 25/51] adds silver sulf syringes instead of kelotane pills --- code/game/objects/items/weapons/storage/firstaid.dm | 4 ++-- code/modules/reagents/reagent_containers/pill.dm | 7 ------- code/modules/reagents/reagent_containers/syringes.dm | 5 +++++ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 16b4767ceba..1b285543b59 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -45,8 +45,8 @@ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/kelotane(src) - new /obj/item/weapon/reagent_containers/pill/kelotane(src) + new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) + new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 8246b5a7eb7..2a99e768c75 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -134,13 +134,6 @@ list_reagents = list("sal_acid" = 24) roundstart = 1 -/obj/item/weapon/reagent_containers/pill/kelotane - name = "kelotane pill" - desc = "Catalyzes the healing of burns." - icon_state = "pill5" - list_reagents = list("kelotane" = 20) - roundstart = 1 - /obj/item/weapon/reagent_containers/pill/insulin name = "insulin pill" desc = "Handles hyperglycaemic coma." diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 46b77827093..d55336243bc 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -216,6 +216,11 @@ desc = "Contains charcoal." list_reagents = list("charcoal" = 15) +/obj/item/weapon/reagent_containers/syringe/silver_sulf + name = "syringe (charcoal)" + desc = "Contains silver sulfadiazine." + list_reagents = list("silver_sulfadiazine" = 15) + /obj/item/weapon/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" desc = "Contains antiviral agents." From 2c56462e97119d9a192f8124dc6e1d3596520a2a Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 24 Aug 2015 22:45:37 -0400 Subject: [PATCH 26/51] I sure do love me some copypasta --- code/modules/reagents/reagent_containers/syringes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d55336243bc..6f5e5bb1c7a 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -217,7 +217,7 @@ list_reagents = list("charcoal" = 15) /obj/item/weapon/reagent_containers/syringe/silver_sulf - name = "syringe (charcoal)" + name = "syringe (silver sulfadiazine)" desc = "Contains silver sulfadiazine." list_reagents = list("silver_sulfadiazine" = 15) From 460c2c290c216e1b473897c773e83f5df1925490 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Tue, 25 Aug 2015 05:31:02 -0300 Subject: [PATCH 27/51] Fixes the admin message not appearing under certain conditions when the rapid dupe experimentator relic is used. All objects from said relic will spawn at the same time now. --- code/modules/research/experimentor.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e57a3762319..acb72b88205 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -703,7 +703,8 @@ R.realProc = realProc R.revealed = TRUE dupes |= R - R.throw_at(pick(oview(7,get_turf(src))),10,1) + spawn() + R.throw_at(pick(oview(7,get_turf(src))),10,1) counter = 0 spawn(rand(10,100)) for(counter = 1; counter <= dupes.len; counter++) From 9572bd6aa65bd81dd1bf0f97a6d9d72adbd9d4a0 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Tue, 25 Aug 2015 03:24:34 -0700 Subject: [PATCH 28/51] -First revision of Swarmer mob, hud, icons, etc -Adds functionality of ignored damage types to simple mobs -Adds functionality of melee damage types to simple mobs --- code/_onclick/hud/hud.dm | 2 + code/game/machinery/doors/windowdoor.dm | 6 +- .../structures/crates_lockers/closets.dm | 1 + .../structures/stool_bed_chair_nest/stools.dm | 6 +- code/game/objects/structures/window.dm | 2 +- .../mob/living/carbon/alien/alien_defense.dm | 14 +- code/modules/mob/living/carbon/carbon.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/monkey/monkey.dm | 14 +- code/modules/mob/living/silicon/silicon.dm | 14 +- .../living/simple_animal/bot_swarm/swarmer.dm | 419 ++++++++++++++++++ .../mob/living/simple_animal/simple_animal.dm | 23 +- code/modules/mob/mob_helpers.dm | 5 + icons/mob/swarmer.dmi | Bin 0 -> 12804 bytes tgstation.dme | 1 + 16 files changed, 498 insertions(+), 19 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm create mode 100644 icons/mob/swarmer.dmi diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index fb209d087e7..d947bfa6553 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -197,6 +197,8 @@ var/datum/global_hud/global_hud = new() blob_hud() else if(isdrone(mymob)) drone_hud(ui_style) + else if(isswarmer(mymob)) + swarmer_hud() //Version denotes which style should be displayed. blank or 0 means "next version" diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 82a66b848e1..fbf9c5b26f3 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -235,10 +235,8 @@ return var/mob/living/simple_animal/M = user M.do_attack_animation(src) - if(M.melee_damage_upper <= 0) - return - attack_generic(M, M.melee_damage_upper) - + if(M.melee_damage_upper > 0 && (M.melee_damage_type == BRUTE || M.melee_damage_type == BURN)) + attack_generic(M, M.melee_damage_upper) /obj/machinery/door/window/attack_slime(mob/living/simple_animal/slime/user) user.do_attack_animation(src) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index bb209cb9515..8fa1375a480 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -166,6 +166,7 @@ /obj/structure/closet/ex_act(severity, target) contents_explosion(severity, target) + new /obj/item/stack/sheet/metal(loc) dump_contents() qdel(src) ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 696ed292eb9..b7862562752 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -11,11 +11,13 @@ qdel(src) return if(2.0) - if (prob(50)) + if (prob(70)) + new /obj/item/stack/sheet/metal(loc) qdel(src) return if(3.0) - if (prob(5)) + if (prob(50)) + new /obj/item/stack/sheet/metal(loc) qdel(src) return return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6c02cd7e7d0..9dc8d6631e9 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -168,7 +168,7 @@ var/mob/living/simple_animal/M = user M.do_attack_animation(src) - if(M.melee_damage_upper <= 0) + if(M.melee_damage_upper <= 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN)) return attack_generic(M, M.melee_damage_upper) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index fd3fff64a4b..20577531b27 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -73,7 +73,19 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) updatehealth() /mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8fdb1c39ccf..7459a055067 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -74,9 +74,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) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 795c7e68da7..4679a8d33e5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -270,7 +270,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,7 +280,7 @@ heart_attack = 0 if(stat == CONSCIOUS) src << "You feel your heart beating again!" - return ..(shock_damage,source,siemens_coeff) + return ..(shock_damage,source,siemens_coeff,safety,override) /mob/living/carbon/human/Topic(href, href_list) if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7a39b9969fe..98a8c3b6eed 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -389,7 +389,7 @@ emp_act var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone)) var/armor = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor) + apply_damage(damage, M.melee_damage_type, affecting, armor) updatehealth() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 5f721ecb512..bd9a1af5f52 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -155,7 +155,19 @@ /mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) updatehealth() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 83b20b450cb..1a42c2e82f2 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -381,7 +381,19 @@ /mob/living/silicon/attack_animal(mob/living/simple_animal/M) if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) updatehealth() /mob/living/silicon/attack_paw(mob/living/user) diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm new file mode 100644 index 00000000000..c59d080c862 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -0,0 +1,419 @@ +////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" || gc_destroyed) + 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" + 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 = 30 + maxHealth = 30 + 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 = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + environment_smash = 0 + attacktext = "shocks" + attack_sound = null + friendly = "pinches" + speed = 0 + faction = list("swarmer") + AIStatus = AI_OFF + projectiletype = /obj/item/projectile/beam/disabler + pass_flags = PASSTABLE | PASSMOB + has_unlimited_silicon_privilege = 1 + ventcrawler = 2 + ranged = 1 + projectiletype = /obj/item/projectile/beam/disabler + ranged_cooldown_cap = 2 + projectilesound = 'sound/weapons/taser2.ogg' + var/resources = 0 //Resource points, generated by consuming metal/glass + +/mob/living/simple_animal/hostile/swarmer/Login() + ..() + src << "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate." + src << "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, or destroying the environment." + src << "Objectives:" + src << "1. Consume resources and replicate until there are no more resources left." + src << "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable." + src << "3. Biological resources will be harvested at a later date, do not harm them." + +/mob/living/simple_animal/hostile/swarmer/New() + ..() + verbs -= /mob/living/verb/pulled + +/mob/living/simple_animal/hostile/swarmer/Stat() + ..() + if(statpanel("Status")) + stat("Resources",resources) + +/mob/living/simple_animal/hostile/swarmer/death(gibbed) + ..(gibbed) + new /obj/effect/decal/cleanable/robot_debris(src.loc) + ghostize() + qdel(src) + +/mob/living/simple_animal/hostile/swarmer/emp_act() + if(health > 1) + health = 1 + ..() + health = 0 + +/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) + face_atom(A) + if(!isturf(loc)) + return + if(next_move > world.time) + return + if(!A.Adjacent(src)) + return + if(isliving(A)) + DisperseTarget(A) + return + if(istype(A, /obj/item)) + Integrate(A) + return + if(istype(A, /turf/simulated/floor))//Stops you from disintegrating mobs to death or other assorted nonsense, as turf ex_act calls it on its contents + return + DisIntegrate(A) + return + +/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0) + if(!isturf(loc)) + src << "This is not a suitable location for fabrication. We need more space." + if(resources >= fabrication_cost) + resources -= fabrication_cost + else + src << "You do not have the necessary resources to fabricate this object" + return 0 + new fabrication_object(loc) + return 1 + +/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target) + if(resources >= 100) + src << "We cannot hold more materials!" + return + if(istype(target, /obj/item/weapon/gun)) + src << "This object has been adjusted to resist disintegration"//Stops swarmers from devouring the entire armory in seconds + return + if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS])) + if(istype(target, /obj/item/stack)) + if(istype(target, /obj/item/stack/cable_coil))//Wiring is just too plentiful + src << "This object does not contain enough materials to work with." + return + var/obj/item/stack/S = target + resources++ + S.amount-- + if(S.amount > 0) + return + resources++ + do_attack_animation(target) + qdel(target) + else + src << "This object does not contain enough materials to work with." + return + +/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target) + if(istype(target, /turf/simulated/wall) || istype(target, /obj/structure/window)) + if(locate(/turf/space) in range(1, target)) + src << "Destroying this object has the potential to cause a hull breach. Aborting." + return + if(istype(target, /obj/structure/reagent_dispensers/fueltank)) + src << "Destroying this object would cause a chain reaction. Aborting." + return + if(istype(target, /obj/machinery/portable_atmospherics/canister)) + src << "An inhospitable area may be created as a result of destroying this object. Aborting." + return + if(istype(target, /obj/structure/cable) || istype(target, /obj/machinery/power/apc) || istype(target, /obj/machinery/power/smes)) + src << "Disrupting the power grid would bring no benefit to us. Aborting." + return + if(istype(target, /obj/machinery/power/emitter))//Stop trying to release the singularity you fuck + src << "This object is too risky to destroy. Aborting." + return + new /obj/effect/effect/sparks(get_turf(target)) + do_attack_animation(target) + changeNext_move(CLICK_CD_MELEE) + target.ex_act(3) + return + +/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) + if(target != src) + src << "Attempting to remove this being from our presence." + if(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 + +/obj/effect/swarmer //Default destroyable object for swarmer constructions + name = "swarmer construction" + desc = "Debug swarmer item, this shouldn't be here. Yell at a coder." + gender = NEUTER + icon = 'icons/mob/swarmer.dmi' + icon_state = "ui_light" + luminosity = 1 + var/health = 30 + +/obj/effect/swarmer/proc/TakeDamage(damage) + health -= damage + if(health <= 0) + qdel(src) + +/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj) + if(Proj.damage) + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + TakeDamage(Proj.damage) + ..() + +/obj/effect/swarmer/attackby(obj/item/weapon/I, mob/living/user, params) + if(istype(I, /obj/item/weapon)) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + TakeDamage(I.force) + return + +/obj/effect/swarmer/ex_act() + qdel(src) + return + +/obj/effect/swarmer/blob_act() + qdel(src) + return + +/obj/effect/swarmer/attack_animal(mob/living/user) + if(isanimal(user)) + var/mob/living/simple_animal/S = user + S.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + if(S.melee_damage_type == BRUTE || S.melee_damage_type == BURN) + TakeDamage(rand(S.melee_damage_lower, S.melee_damage_upper)) + return + +/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap() + set name = "Create trap" + set category = "Swarmer" + set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources" + if(/obj/effect/swarmer/trap in loc) + src << "There is already a trap here. Aborting." + return + Fabricate(/obj/effect/swarmer/trap, 5) + return + +/obj/effect/swarmer/trap + name = "swarmer trap" + desc = "A quickly assembled electric trap. Will not retain its form if damaged enough." + icon_state = "trap" + luminosity = 1 + health = 10 + +/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) + L.electrocute_act(0, src, 1, 1) + qdel(src) + ..() + +/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade() + set name = "Create barricade" + set category = "Swarmer" + set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." + if(/obj/effect/swarmer/blockade in loc) + src << "There is already a blockade here. Aborting." + return + Fabricate(/obj/effect/swarmer/blockade, 5) + return + +/obj/effect/swarmer/blockade + name = "swarmer blockade" + desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." + icon_state = "barricade" + luminosity = 1 + health = 50 + density = 1 + anchored = 1 + +/obj/effect/swarmer/blockade/CanPass(atom/movable/O) + if(istype(O, /mob/living/simple_animal/hostile/swarmer)) + return 1 + if(istype(O, /obj/item/projectile/beam/disabler)) + return 1 + ..() + +/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() + set name = "Replicate" + set category = "Swarmer" + set desc = "Creates a shell for a new swarmer. Swarmers will self activate." + src << "We are attempting to replicate ourselves. We will need to stand still until the process is complete." + if(resources < 50) + src << "We do not have the resources for this!" + return + if(!isturf(loc)) + src << "This is not a suitable location for replicating ourselves. We need more room." + return + if(do_mob(src, src, 100)) + if(Fabricate(/obj/item/unactivated_swarmer, 50)) + playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1) + +/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() + set name = "Self Repair" + set category = "Swarmer" + set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete." + if(!isturf(loc)) + return + src << "Attempting to repair damage to our body, stand by..." + if(do_mob(src, src, 100)) + adjustBruteLoss(-100) + src << "We successfully repaired ourselves." + +/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() + if(!luminosity) + SetLuminosity(3) + else + SetLuminosity(0) + +/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() + var/message = input(src, "Announce to other swarmers", "Swarmer contact") + if(message) + for(var/mob/living/simple_animal/hostile/swarmer/S in world) + if(S != src) + S << "Swarm communication: [message]" + + +////HUD NONSENSE//// +/obj/screen/swarmer + icon = 'icons/mob/swarmer.dmi' + +/obj/screen/swarmer/FabricateTrap + icon_state = "ui_trap" + name = "Create trap" + desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" + +/obj/screen/swarmer/FabricateTrap/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.CreateTrap() + +/obj/screen/swarmer/Barricade + icon_state = "ui_barricade" + name = "Create barricade" + desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" + +/obj/screen/swarmer/Barricade/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.CreateBarricade() + +/obj/screen/swarmer/Replicate + icon_state = "ui_replicate" + name = "Replicate" + desc = "Creates a another of our kind. (Costs 50 resources)" + +/obj/screen/swarmer/Replicate/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.CreateSwarmer() + +/obj/screen/swarmer/RepairSelf + icon_state = "ui_self_repair" + name = "Repair self" + desc = "Repairs damage to our body." + +/obj/screen/swarmer/RepairSelf/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.RepairSelf() + +/obj/screen/swarmer/ToggleLight + icon_state = "ui_light" + name = "Toggle light" + desc = "Toggles our inbuilt light on or off." + +/obj/screen/swarmer/ToggleLight/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.ToggleLight() + +/obj/screen/swarmer/ContactSwarmers + icon_state = "ui_contact_swarmers" + name = "Contact swarmers" + desc = "Sends a message to all other swarmers, should they exist." + +/obj/screen/swarmer/ContactSwarmers/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.ContactSwarmers() + +/datum/hud/proc/swarmer_hud(ui_style = 'icons/mob/screen_midnight.dmi') + adding = list() + + var/obj/screen/using + + using = new /obj/screen/swarmer/FabricateTrap() + using.screen_loc = ui_rhand + adding += using + + using = new /obj/screen/swarmer/Barricade() + using.screen_loc = ui_lhand + adding += using + + using = new /obj/screen/swarmer/Replicate() + using.screen_loc = ui_zonesel + adding += using + + using = new /obj/screen/swarmer/RepairSelf() + using.screen_loc = ui_storage1 + adding += using + + using = new /obj/screen/swarmer/ToggleLight() + using.screen_loc = ui_back + adding += using + + using = new /obj/screen/swarmer/ContactSwarmers() + using.screen_loc = ui_inventory + adding += using + + mymob.client.screen = list() + mymob.client.screen += mymob.client.void + mymob.client.screen += adding + diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 6a9927b9fc3..7c03a9fa427 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -41,6 +41,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 = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) //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 @@ -252,7 +254,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 +264,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 +348,8 @@ attack_threshold_check(damage) return 1 -/mob/living/simple_animal/proc/attack_threshold_check(damage) - if(damage <= force_threshold) +/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE) + if(damage <= force_threshold || ignored_damage_types[damagetype]) visible_message("[src] looks unharmed.") else adjustBruteLoss(damage) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 857b7f35181..c53fa9b1d3a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -125,6 +125,11 @@ return 1 return 0 +/proc/isswarmer(A) + if(istype(A, /mob/living/simple_animal/hostile/swarmer)) + return 1 + return 0 + /proc/islimb(A) if(istype(A, /obj/item/organ/limb)) return 1 diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi new file mode 100644 index 0000000000000000000000000000000000000000..96a9f9ae09e1870344142cbb3439434468f5082e GIT binary patch literal 12804 zcmaL8by!qw^ftPO8hS{T21x-yx|yLnRU{+?1ZkvuMnn(=X%z*A5D){9kZ$SDk#1q6 z2asmY=KY=TT<5yZ_nm+C>^-xeUeA5sYprKujSaP^$eGCj0HD&*RyPFz2zU!DkdlDc zO_ge6@MAmVp1Gg;V_yd!7jHioFHZmn%7{H6O?ow zY0{}Hyh{X?|XBbm8*e9 z*tY|(m#=ge9v!~E$y)j;O^R2K2sZHHxt$uVVwlBU)A;MV3v={=qIr76XJ;PQ-til`qm@8k^Uo!6*&>l{%4W4h zl-6HwR8%)`ieS~hz+M<92pjEvtdgy~kqW&h$l*UxI_sRc-7q8C*X$g)HFAdu z6NPyW*0<}BGs+LvvKn`^=C6fE+_(PQD1Q{Ormz+^e=@L~g)Yg@CuU`3t%+4Ek!Wsd zS!AmwTv+IOv=W*LdE+O^9#=05^zEb!^kxr7TO3-Mve|GFHw z0n{IvNSDEa$5sY~Z=oftq1Km^oah-s$BxSpRzL>uT1nBxaj>h*a1a42{F;ffoDoMJ zi~#UyWUIhof1xt0q!-Sz5(-HN>r8AQL4<~W$H^oQynC_joisz|#O57RL>|#b3&^1Qy7+^Kgw%xm?E~ogC{8AgFKt>V&PFq@Y79R4 z7$c(rS*uslDU>ovHNZ89AVrg0&PE>+|M%CCD9As*47 zlGPNPYXrAIf!dcAM9m{et_mSSBGLsv8fx>i<-choKHDf5@wcjkcSC}#0UH(+24|F( zMV%skGM7Hqe!uz1EWdGdbyZ!S`196opE~KL|4HcWd7-luRuqO9v*GR4w;RFqs)Qhzd;T@4u+RfYy)+=Yc-0WB=0cF~a7~1z3 zaDDLZiAFeJWkDGzVaa}nYp{vNSvF!;(Ns9BqO8S4G&kT0_&RemXa1A_hFRUI43mZ- zoHmVo0GsP54Aqd^2@lM5_3&%RUN9a@zvUy9JkYaI>e+i#d*1MNC+*_#crako=0^Bw zANZ`LuW96Hs_VS!zpmd6zTi6yVOEB5-X&?~LbB+4)w}X#reSg*E z2oDV5$qd9Ct)lg)jgJ(;&akqkYw&G}3I#)CWo5+)d⩽rRN}#}3why&bjd`-5=w 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 383abb503be..bee9ba9f7a1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1229,6 +1229,7 @@ #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\bot_swarm\swarmer.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" From 908da0a29a1cd5281b347066ce5a07a10ca87b1c Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 25 Aug 2015 10:07:51 -0700 Subject: [PATCH 29/51] Update subsystems.dm --- code/controllers/subsystems.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems.dm b/code/controllers/subsystems.dm index 88e3451a4d2..5c3c9a50f72 100644 --- a/code/controllers/subsystems.dm +++ b/code/controllers/subsystems.dm @@ -47,7 +47,7 @@ /datum/subsystem/proc/stat_entry(msg) var/dwait = "" if (dynamic_wait) - dwait = "DWait:[wait]ds " + dwait = "DWait:[round(wait,0.1)]ds " stat(name, "[round(cost,0.001)]ds\t[dwait][msg]") @@ -59,4 +59,4 @@ //usually called via datum/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) //should attempt to salvage what it can from the old instance of subsystem -/datum/subsystem/proc/Recover() \ No newline at end of file +/datum/subsystem/proc/Recover() From 6ab24432557827994a7b59151f752ce758d32ab7 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Tue, 25 Aug 2015 13:46:05 -0400 Subject: [PATCH 30/51] Adds oxandrolone, a new burn medication designed to work upon ingestion. Adds oxandrolone to burn kits. Adds changelog. --- .../objects/items/weapons/storage/firstaid.dm | 4 +-- .../Chemistry-Reagents/Medicine-Reagents.dm | 25 ++++++++++++++++++- .../reagents/Chemistry-Recipes/Medicine.dm | 6 +++++ .../reagents/reagent_containers/pill.dm | 6 +++++ .../reagents/reagent_containers/syringes.dm | 5 ---- .../bgobandit - salicyclicassblastusa.yml | 7 ++++++ 6 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 html/changelogs/bgobandit - salicyclicassblastusa.yml diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 1b285543b59..65e2b67e0b3 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -45,8 +45,8 @@ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) - new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) + new /obj/item/weapon/reagent_containers/pill/oxandrolone(src) + new /obj/item/weapon/reagent_containers/pill/oxandrolone(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) return diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 80aea6a6168..39496a45272 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -173,7 +173,7 @@ if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + M << "You probably shouldn't have eaten that. Maybe you should have splashed it on, or applied a patch?" ..() return @@ -182,6 +182,29 @@ ..() return +/datum/reagent/medicine/oxandrolone + name = "Oxandrolone" + id = "oxandrolone" + description = "Stimulates healing of severe burns. If you have more than 50 burn damage, it heals 2 units; otherwise, 0.5. If overdosed it will exacerbate existing burns, causing burn and brute damage." + reagent_state = LIQUID + color = "#f7ffa5" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 25 + +/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/M) + if(M.getFireLoss() > 50) + M.adjustFireLoss(-2*REM) + else + M.adjustFireLoss(-0.5*REM) + ..() + return + +/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M) + M.adjustFireLoss(2.5*REM) // it's going to be healing either 2 or 0.5 + M.adjustBruteLoss(0.5*REM) + ..() + return + /datum/reagent/medicine/styptic_powder name = "Styptic Powder" id = "styptic_powder" diff --git a/code/modules/reagents/Chemistry-Recipes/Medicine.dm b/code/modules/reagents/Chemistry-Recipes/Medicine.dm index 357eac96a5e..72e00ded6a1 100644 --- a/code/modules/reagents/Chemistry-Recipes/Medicine.dm +++ b/code/modules/reagents/Chemistry-Recipes/Medicine.dm @@ -102,6 +102,12 @@ required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/oxandrolone + name = "Oxandrolone" + id = "oxandrolone" + result = "oxandrolone" + required_reagents = list("carbon" = 3, "phenol" = 1, "hydrogen" = 1, "oxygen" = 1) + result_amount = 6 /datum/chemical_reaction/salbutamol name = "Salbutamol" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 2a99e768c75..94ece6ee2c0 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -133,6 +133,12 @@ icon_state = "pill5" list_reagents = list("sal_acid" = 24) roundstart = 1 +/obj/item/weapon/reagent_containers/pill/oxandrolone + name = "oxandrolone pill" + desc = "Used to stimulate burn healing." + icon_state = "pill5" + list_reagents = list("oxandrolone" = 24) + roundstart = 1 /obj/item/weapon/reagent_containers/pill/insulin name = "insulin pill" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 6f5e5bb1c7a..46b77827093 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -216,11 +216,6 @@ desc = "Contains charcoal." list_reagents = list("charcoal" = 15) -/obj/item/weapon/reagent_containers/syringe/silver_sulf - name = "syringe (silver sulfadiazine)" - desc = "Contains silver sulfadiazine." - list_reagents = list("silver_sulfadiazine" = 15) - /obj/item/weapon/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" desc = "Contains antiviral agents." diff --git a/html/changelogs/bgobandit - salicyclicassblastusa.yml b/html/changelogs/bgobandit - salicyclicassblastusa.yml new file mode 100644 index 00000000000..8f54843614a --- /dev/null +++ b/html/changelogs/bgobandit - salicyclicassblastusa.yml @@ -0,0 +1,7 @@ +author: bgobandit + +delete-after: True + +changes: + - bugfix: "Overheard at CentComm: 'This burn kit said salicyclic acid would heal my burns! WHO MADE THIS SHIT?' A muffled honking is heard in the background. (Burn first-aid kits now contain an appropriate burn pill.)" + - rscadd: "Oxandrolone, a new burn healing medication, has been added to burn first-aid kits and to chemistry. Ingesting 25 units or more causes burn and brute damage." \ No newline at end of file From d211992ddcd3e693c402068551e4bf415204fd82 Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 25 Aug 2015 20:22:30 +0200 Subject: [PATCH 31/51] Make it so the code doesn't rebuild (propagate_network()) the wire network X times when singulo/explosion destroys a line of X cables at once. --- code/modules/power/cable.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4e380448a3f..02c9e1adfca 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -432,12 +432,15 @@ By design, d1 is the smallest direction and d2 is the highest P.disconnect_from_network() //remove from current network (and delete powernet) return + var/obj/O = P_list[1] // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist loc = null powernet.remove_cable(src) //remove the cut cable from its powernet - var/datum/powernet/newPN = new()// creates a new powernet... - propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable + spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables + if(O && !qdeleted(O)) + var/datum/powernet/newPN = new()// creates a new powernet... + propagate_network(O, newPN)//... and propagates it to the other side of the cable // Disconnect machines connected to nodes if(d1 == 0) // if we cut a node (O-X) cable From 6277a80cdba174a73dcd85aa0294aea10aa55216 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Tue, 25 Aug 2015 14:02:48 -0700 Subject: [PATCH 32/51] -Fixes infinite wumbo-ing --- code/modules/mob/living/simple_animal/hostile/mining_mobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index d06cd0672c7..052dc76c46a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -602,7 +602,7 @@ /obj/item/asteroid/fugu_gland/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag && istype(target, /mob/living/simple_animal)) var/mob/living/simple_animal/A = target - if(A.buffed || A.type in banned_mobs || A.stat) + if(A.buffed || (A.type in banned_mobs) || A.stat) user << "Something's interfering with the [src]'s effects. It's no use." return A.buffed++ From 3749dcacb328a4c749e54fa529da3b4b065ff241 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Wed, 26 Aug 2015 06:47:27 -0300 Subject: [PATCH 33/51] Creates type paths for all types of floors in floor.dmi, first step for the floor organization. --- .../turfs/simulated/floor/plasteel_floor.dm | 336 +++++++++++++++++- 1 file changed, 324 insertions(+), 12 deletions(-) diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index 51b551565c5..555e25b09be 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -11,8 +11,36 @@ icon_state = icon_regular_floor + /turf/simulated/floor/plasteel/black icon_state = "dark" +/turf/simulated/floor/plasteel/black/side + icon_state = "black" //NOTICE ME SEMPAI: floors.dmi contains two sprites named black, remove the incorrect one +/turf/simulated/floor/plasteel/black/corner + icon_state = "blackcorner" + + +/turf/simulated/floor/plasteel/white + icon_state = "white" +/turf/simulated/floor/plasteel/white/side + icon_state = "whitehall" +/turf/simulated/floor/plasteel/white/corner + icon_state = "whitecorner" + + + +/turf/simulated/floor/plasteel/brown + icon_state = "brown" +/turf/simulated/floor/plasteel/brown/corner + icon_state = "browncorner" + +/turf/simulated/floor/plasteel/darkbrown + icon_state = "darkbrownfull" +/turf/simulated/floor/plasteel/darkbrown/side + icon_state = "darkbrown" +/turf/simulated/floor/plasteel/darkbrown/corner + icon_state = "darkbrowncorners" + /turf/simulated/floor/plasteel/green @@ -22,7 +50,6 @@ /turf/simulated/floor/plasteel/green/corner icon_state = "greencorner" - /turf/simulated/floor/plasteel/darkgreen icon_state = "darkgreenfull" /turf/simulated/floor/plasteel/darkgreen/side @@ -30,11 +57,13 @@ /turf/simulated/floor/plasteel/darkgreen/corner icon_state = "darkgreencorners" +/turf/simulated/floor/plasteel/whitegreen + icon_state = "whitegreenfull" +/turf/simulated/floor/plasteel/whitegreen/side + icon_state = "whitegreen" +/turf/simulated/floor/plasteel/whitegreen/corner + icon_state = "whitegreencorner" -/turf/simulated/floor/plasteel/brown - icon_state = "brown" -/turf/simulated/floor/plasteel/brown/corner - icon_state = "browncorner" /turf/simulated/floor/plasteel/red @@ -44,7 +73,6 @@ /turf/simulated/floor/plasteel/red/corner icon_state = "redcorner" - /turf/simulated/floor/plasteel/darkred icon_state = "darkredfull" /turf/simulated/floor/plasteel/darkred/side @@ -52,6 +80,90 @@ /turf/simulated/floor/plasteel/darkred/corner icon_state = "darkredcorners" +/turf/simulated/floor/plasteel/whitered + icon_state = "whiteredfull" +/turf/simulated/floor/plasteel/whitered/side + icon_state = "whitered" +/turf/simulated/floor/plasteel/whitered/corner + icon_state = "whiteredcorner" + + + +/turf/simulated/floor/plasteel/blue + icon_state = "bluefull" +/turf/simulated/floor/plasteel/blue/side + icon_state = "blue" +/turf/simulated/floor/plasteel/blue/corner + icon_state = "bluecorner" + +/turf/simulated/floor/plasteel/darkblue + icon_state = "darkbluefull" +/turf/simulated/floor/plasteel/darkblue/side + icon_state = "darkblue" +/turf/simulated/floor/plasteel/darkblue/corner + icon_state = "darkbluecorners" + +/turf/simulated/floor/plasteel/whiteblue + icon_state = "whitebluefull" +/turf/simulated/floor/plasteel/whiteblue/side + icon_state = "whiteblue" +/turf/simulated/floor/plasteel/whiteblue/corner + icon_state = "whitebluecorner" + + + +/turf/simulated/floor/plasteel/yellow + icon_state = "yellowfull" +/turf/simulated/floor/plasteel/yellow/side + icon_state = "yellow" +/turf/simulated/floor/plasteel/yellow/corner + icon_state = "yellowcorner" + +/turf/simulated/floor/plasteel/darkyellow + icon_state = "darkyellowfull" +/turf/simulated/floor/plasteel/darkyellow/side + icon_state = "darkyellow" +/turf/simulated/floor/plasteel/darkyellow/corner + icon_state = "darkyellowcorners" + +/turf/simulated/floor/plasteel/whiteyellow + icon_state = "whiteyellowfull" +/turf/simulated/floor/plasteel/whiteyellow/side + icon_state = "whiteyellow" +/turf/simulated/floor/plasteel/whiteyellow/corner + icon_state = "whiteyellowcorner" + + + +/turf/simulated/floor/plasteel/purple + icon_state = "purplefull" +/turf/simulated/floor/plasteel/purple/side + icon_state = "purple" +/turf/simulated/floor/plasteel/purple/corner + icon_state = "purplecorner" + +/turf/simulated/floor/plasteel/darkpurple + icon_state = "darkpurplefull" +/turf/simulated/floor/plasteel/darkpurple/side + icon_state = "darkpurple" +/turf/simulated/floor/plasteel/darkpurple/corner + icon_state = "darkpurplecorners" + +/turf/simulated/floor/plasteel/whitepurple + icon_state = "whitepurplefull" +/turf/simulated/floor/plasteel/whitepurple/side + icon_state = "whitepurple" +/turf/simulated/floor/plasteel/whitepurple/corner + icon_state = "whitepurplecorner" + + +/turf/simulated/floor/plasteel/orange + icon_state = "orangefull" +/turf/simulated/floor/plasteel/orange/side + icon_state = "orange" +/turf/simulated/floor/plasteel/orange/corner + icon_state = "orangecorner" + /turf/simulated/floor/plasteel/neutral icon_state = "neutralfull" @@ -61,12 +173,48 @@ icon_state = "neutralcorner" +/turf/simulated/floor/plasteel/arrival + icon_state = "arrival" +/turf/simulated/floor/plasteel/arrival/corner + icon_state = "arrivalcorner" + + +/turf/simulated/floor/plasteel/escape + icon_state = "escape" +/turf/simulated/floor/plasteel/escape/corner + icon_state = "escapecorner" + + +/turf/simulated/floor/plasteel/caution + icon_state = "caution" +/turf/simulated/floor/plasteel/caution/corner + icon_state = "cautioncorner" + + /turf/simulated/floor/plasteel/warning icon_state = "warning" /turf/simulated/floor/plasteel/warning/corner icon_state = "warningcorner" +/turf/simulated/floor/plasteel/warnplate + icon_state = "warnplate" +/turf/simulated/floor/plasteel/warnplate/corner + icon_state = "warnplatecorner" + + +/turf/simulated/floor/plasteel/warnwhite + icon_state = "warnwhite" +/turf/simulated/floor/plasteel/warnwhite/corner + icon_state = "warnwhitecorner" + + +/turf/simulated/floor/plasteel/whitebot + icon_state = "whitebot" +/turf/simulated/floor/plasteel/whitebot/delivery + icon_state = "whitedelivery" + + /turf/simulated/floor/plasteel/redyellow icon_state = "redyellowfull" /turf/simulated/floor/plasteel/redyellow/side @@ -75,15 +223,45 @@ /turf/simulated/floor/plasteel/redblue icon_state = "redbluefull" -/turf/simulated/floor/plasteel/redblue/side +/turf/simulated/floor/plasteel/redblue/blueside + icon_state = "bluered" +/turf/simulated/floor/plasteel/redblue/redside icon_state = "redblue" +/turf/simulated/floor/plasteel/redgreen + icon_state = "redgreenfull" +/turf/simulated/floor/plasteel/redgreen/side + icon_state = "redgreen" + + +/turf/simulated/floor/plasteel/greenyellow + icon_state = "greenyellowfull" +/turf/simulated/floor/plasteel/greenyellow/side + icon_state = "greenyellow" + + +/turf/simulated/floor/plasteel/greenblue + icon_state = "greenbluefull" +/turf/simulated/floor/plasteel/greenblue/side + icon_state = "greenblue" + + +/turf/simulated/floor/plasteel/blueyellow + icon_state = "blueyellowfull" +/turf/simulated/floor/plasteel/blueyellow/side + icon_state = "blueyellow" + + /turf/simulated/floor/plasteel/darkwarning icon_state = "warndark" /turf/simulated/floor/plasteel/darkwarning/corner icon_state = "warndarkcorners" +/turf/simulated/floor/plasteel/warningline + icon_state = "warningline" +/turf/simulated/floor/plasteel/warningline/corner + icon_state = "warninglinecorners" /turf/simulated/floor/plasteel/yellowsiding icon_state = "yellowsiding" @@ -97,12 +275,86 @@ icon_state = "podhatchcorner" + +/turf/simulated/floor/plasteel/circuit + icon_state = "bcircuit" +/turf/simulated/floor/plasteel/circuit/off + icon_state = "bcircuitoff" + +/turf/simulated/floor/plasteel/circuit/gcircuit + icon_state = "gcircuit" +/turf/simulated/floor/plasteel/circuit/gcircuit/off + icon_state = "gcircuitoff" +/turf/simulated/floor/plasteel/circuit/gcircuit/animated + icon_state = "gcircuitanim" + +/turf/simulated/floor/plasteel/circuit/rcircuit + icon_state = "rcircuit" +/turf/simulated/floor/plasteel/circuit/rcircuit/animated + icon_state = "rcircuitanim" + + + /turf/simulated/floor/plasteel/loadingarea icon_state = "loadingarea" +/turf/simulated/floor/plasteel/loadingarea/dirty + icon_state = "loadingareadirty1" +/turf/simulated/floor/plasteel/loadingarea/dirtydirty + icon_state = "loadingareadirty2" + + +/turf/simulated/floor/plasteel/shuttle + icon_state = "shuttlefloor" +/turf/simulated/floor/plasteel/shuttle/red + name = "Brig floor" + icon_state = "shuttlefloor4" +/turf/simulated/floor/plasteel/shuttle/yellow + icon_state = "shuttlefloor2" +/turf/simulated/floor/plasteel/shuttle/white + icon_state = "shuttlefloor3" +/turf/simulated/floor/plasteel/shuttle/purple + icon_state = "shuttlefloor5" + + +/turf/simulated/floor/plasteel/asteroid + icon_state = "asteroidfloor" +/turf/simulated/floor/plasteel/asteroid/warning + icon_state = "asteroidwarning" + + +/turf/simulated/floor/plasteel/recharge_floor + icon_state = "recharge_floor" +/turf/simulated/floor/plasteel/recharge_floor/asteroid + icon_state = "recharge_floor_asteroid" + + +/turf/simulated/floor/plasteel/chapel + icon_state = "chapel" + +/turf/simulated/floor/plasteel/showroomfloor + icon_state = "showroomfloor" + +/turf/simulated/floor/plasteel/floorgrime + icon_state = "floorgrime" + +/turf/simulated/floor/plasteel/solarpanel + icon_state = "solarpanel" + +/turf/simulated/floor/plasteel/cmo + icon_state = "cmo" + +/turf/simulated/floor/plasteel/barber + icon_state = "barber" + +/turf/simulated/floor/plasteel/hydrofloor + icon_state = "hydrofloor" /turf/simulated/floor/plasteel/delivery icon_state = "delivery" +/turf/simulated/floor/plasteel/bot + icon_state = "bot" + /turf/simulated/floor/plasteel/freezer icon_state = "freezerfloor" @@ -115,10 +367,18 @@ /turf/simulated/floor/plasteel/cafeteria icon_state = "cafeteria" +/turf/simulated/floor/plasteel/vault + icon_state = "vault" + /turf/simulated/floor/plasteel/cult icon_state = "cult" name = "engraved floor" +/turf/simulated/floor/plasteel/goonplaque + icon_state = "plaque" + name = "Commemorative Plaque" + desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding." + /turf/simulated/floor/plasteel/cult/narsie_act() return @@ -127,9 +387,61 @@ nitrogen = 0 temperature = TCMB -/turf/simulated/floor/plasteel/shuttle - icon_state = "shuttlefloor" -/turf/simulated/floor/plasteel/shuttle/red - name = "Brig floor" - icon_state = "shuttlefloor4" \ No newline at end of file + + + + +// +//unused? remove? +// +/turf/simulated/floor/plasteel/stage_bottom + icon_state = "stage_bottom" +/turf/simulated/floor/plasteel/stage_left + icon_state = "stage_left" +/turf/simulated/floor/plasteel/stage_bleft + icon_state = "stage_bleft" + + +/turf/simulated/floor/plasteel/stairs + icon_state = "stairs" +/turf/simulated/floor/plasteel/stairs/left + icon_state = "stairs-l" +/turf/simulated/floor/plasteel/stairs/medium + icon_state = "stairs-m" +/turf/simulated/floor/plasteel/stairs/right + icon_state = "stairs-r" +/turf/simulated/floor/plasteel/stairs/old + icon_state = "stairs-old" + + +/turf/simulated/floor/plasteel/brownold + icon_state = "brownold" +/turf/simulated/floor/plasteel/brownold/corner + icon_state = "browncornerold" + + +/turf/simulated/floor/plasteel/rockvault + icon_state = "rockvault" +/turf/simulated/floor/plasteel/rockvault/alien + icon_state = "alienvault" +/turf/simulated/floor/plasteel/rockvault/sandstone + icon_state = "sandstonevault" + + +/turf/simulated/floor/plasteel/elevatorshaft + icon_state = "elevatorshaft" + +/turf/simulated/floor/plasteel/bluespace + icon_state = "bluespace" + +/turf/simulated/floor/plasteel/sepia + icon_state = "sepia" + + +/turf/simulated/floor/plasteel/sandeffect + icon_state = "sandeffect" +/turf/simulated/floor/plasteel/sandeffect/warning + icon_state = "warningsandeffect" +/turf/simulated/floor/plasteel/sandeffect/warning/corner + icon_state = "warningsandeffectcorners" \ No newline at end of file From 1009c08ff4869bbdc79cd9df1bcf8e26eb8ca9f3 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Thu, 27 Aug 2015 14:55:48 -0400 Subject: [PATCH 34/51] Golems no longer take damage from attacking with glass shards. --- code/game/objects/items/stacks/sheets/glass.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 3881915f99d..ce6baf6b105 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -298,7 +298,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user - if(!H.gloves) + if(!H.gloves && !(PIERCEIMMUNE in H.dna.species.specflags)) // golems, etc H << "[src] cuts into your hand!" var/organ = (H.hand ? "l_" : "r_") + "arm" var/obj/item/organ/limb/affecting = H.get_organ(organ) From 99c84a79ea895f6c2e4e7ac97c3298c0154fcc42 Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 27 Aug 2015 22:29:20 +0200 Subject: [PATCH 35/51] fixes ablative reflect --- code/modules/clothing/suits/armor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index d8dc137f797..a9a1d0f6133 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -105,7 +105,7 @@ /obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone) if(!(def_zone in list("chest", "groin"))) //If not shot where ablative is covering you, you don't get the reflection bonus! - hit_reflect_chance = 0 + return 0 if (prob(hit_reflect_chance)) return 1 From 326d84983648bbfc261e842044ba98e47c69e9b5 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Fri, 28 Aug 2015 00:51:24 -0400 Subject: [PATCH 36/51] You can no longer use bruise packs, ointment or other medical stack items on drones. --- code/game/objects/items/stacks/medical.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 7cdfe31e8fb..2be87802f4a 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -25,8 +25,8 @@ user << "\The [M] is dead, you cannot help [t_him]!" return - if(!istype(M)) - user << "You don't know how to apply \the [src] to [M]..." + if(!istype(M) || isdrone(M)) + user << "You cannot apply \the [src] to [M]!" return 1 if(!user.IsAdvancedToolUser()) From 22ffbca5a297f397ca8f65e57c2ddf97b74a354d Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Fri, 28 Aug 2015 05:43:08 +0000 Subject: [PATCH 37/51] Automatic changelog compile --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 7 +++++++ html/changelogs/bgobandit - salicyclicassblastusa.yml | 7 ------- 3 files changed, 14 insertions(+), 7 deletions(-) delete mode 100644 html/changelogs/bgobandit - salicyclicassblastusa.yml diff --git a/html/changelog.html b/html/changelog.html index 74b09bfbaa3..821377b3ad1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,13 @@ -->

+

28 August 2015

+

bgobandit updated:

+
    +
  • Overheard at CentComm: 'This burn kit said salicyclic acid would heal my burns! WHO MADE THIS SHIT?' A muffled honking is heard in the background. (Burn first-aid kits now contain an appropriate burn pill.)
  • +
  • Oxandrolone, a new burn healing medication, has been added to burn first-aid kits and to chemistry. Ingesting 25 units or more causes burn and brute damage.
  • +
+

19 August 2015

Joan updated: