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

28 August 2015

+

bgobandit updated:

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

19 August 2015

Joan updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index eac761cfbc9..b84356a720c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1646,3 +1646,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Splashing someone with chemicals no longer injects those chemicals in their body. - bugfix: Fixes splashing acid on items or floor with items not having any effect. +2015-08-28: + bgobandit: + - bugfix: 'Overheard at CentComm: ''This burn kit said salicyclic acid would heal + my burns! WHO MADE THIS SHIT?'' A muffled honking is heard in the background. + (Burn first-aid kits now contain an appropriate burn pill.)' + - rscadd: Oxandrolone, a new burn healing medication, has been added to burn first-aid + kits and to chemistry. Ingesting 25 units or more causes burn and brute damage. diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index d36bbaeda97..84cb19f814b 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 65366e873a4..248431514e1 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi new file mode 100644 index 00000000000..96a9f9ae09e Binary files /dev/null and b/icons/mob/swarmer.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 26859927fa4..1a2be1b0d3c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1117,6 +1117,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" @@ -1182,7 +1183,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" @@ -1230,6 +1230,7 @@ #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\bot_swarm\swarmer.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" diff --git a/tools/mapmerge/dmm2tgm/Source/dmm2tgm.py b/tools/dmm2tgm/Source/dmm2tgm.py similarity index 100% rename from tools/mapmerge/dmm2tgm/Source/dmm2tgm.py rename to tools/dmm2tgm/Source/dmm2tgm.py diff --git a/tools/mapmerge/dmm2tgm/_hashlib.pyd b/tools/dmm2tgm/_hashlib.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/_hashlib.pyd rename to tools/dmm2tgm/_hashlib.pyd diff --git a/tools/mapmerge/dmm2tgm/bz2.pyd b/tools/dmm2tgm/bz2.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/bz2.pyd rename to tools/dmm2tgm/bz2.pyd diff --git a/tools/mapmerge/dmm2tgm/dmm2tgm.exe b/tools/dmm2tgm/dmm2tgm.exe similarity index 100% rename from tools/mapmerge/dmm2tgm/dmm2tgm.exe rename to tools/dmm2tgm/dmm2tgm.exe diff --git a/tools/mapmerge/dmm2tgm/library.zip b/tools/dmm2tgm/library.zip similarity index 100% rename from tools/mapmerge/dmm2tgm/library.zip rename to tools/dmm2tgm/library.zip diff --git a/tools/mapmerge/dmm2tgm/python27.dll b/tools/dmm2tgm/python27.dll similarity index 100% rename from tools/mapmerge/dmm2tgm/python27.dll rename to tools/dmm2tgm/python27.dll diff --git a/tools/mapmerge/dmm2tgm/select.pyd b/tools/dmm2tgm/select.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/select.pyd rename to tools/dmm2tgm/select.pyd diff --git a/tools/mapmerge/dmm2tgm/unicodedata.pyd b/tools/dmm2tgm/unicodedata.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/unicodedata.pyd rename to tools/dmm2tgm/unicodedata.pyd diff --git a/tools/mapmerge/dmm2tgm/w9xpopen.exe b/tools/dmm2tgm/w9xpopen.exe similarity index 100% rename from tools/mapmerge/dmm2tgm/w9xpopen.exe rename to tools/dmm2tgm/w9xpopen.exe diff --git a/tools/mapmerge/MapMerge.jar b/tools/mapmerge/MapMerge.jar index c8e4349ba42..d0f0ce08028 100644 Binary files a/tools/mapmerge/MapMerge.jar and b/tools/mapmerge/MapMerge.jar differ diff --git a/tools/mapmerge/Source/bin/MapMerge.class b/tools/mapmerge/Source/bin/MapMerge.class index 9a6d17f143f..dff913a6b94 100644 Binary files a/tools/mapmerge/Source/bin/MapMerge.class and b/tools/mapmerge/Source/bin/MapMerge.class differ diff --git a/tools/mapmerge/Source/src/MapMerge.java b/tools/mapmerge/Source/src/MapMerge.java index a2058480a21..552a406b13d 100644 --- a/tools/mapmerge/Source/src/MapMerge.java +++ b/tools/mapmerge/Source/src/MapMerge.java @@ -88,7 +88,9 @@ public class MapMerge { String to_save = selected_map; String[] passInto = { "-clean", backup_map, edited_map, to_save }; MapPatcher.main(passInto); - try{ + + // Will try to fix when I have time ~CorruptComputer + /*try{ Process process = new ProcessBuilder("dmm2tgm\\dmm2tgm.exe", selected_map).start(); }catch(Exception e1){ System.out.println("You are not on a windows machine, trying the .py"); @@ -99,6 +101,7 @@ public class MapMerge { System.out.println("Downloads can be found here: https://www.python.org/downloads/"); } } + */ } }